Skip to content

klppl/verkstad

Repository files navigation

verkstad

A calm, content-first Ghost theme. The home page is a personal index — a well-kept workshop at a glance:

  • Hej — avatar, a one-line hello and an Om mig → door
  • Texter — recent articles as compact archive rows
  • Projekt — a 3×3 grid of compact project previews (#project posts)

System fonts, one sparse rust accent, near-zero JavaScript, dark by default with a sun/moon theme toggle. Swedish UI labels throughout (Texter / Projekt / Nu).

verkstad home page

More screenshots — blog, projects, now page, about
/blog/ — article archive /projects/ — showcase
Article archive Project showcase with hero card and grid
/nu/ — now page + notes log A page — reading view
Now page with curated focus list and notes About page reading view

How content works

Everything is an ordinary Ghost post. Which stream a post lands in is decided by an internal tag (a tag whose name starts with # — these never show publicly). There's nothing else to learn.

You want to write… Do this Where it shows
An article Publish a normal post. No special tag. Home "Texter" timeline + /blog/
A project Add the internal tag #project Home "Projekt" grid + /projects/
A note Add the internal tag #microblog, leave the title empty The /nu/ notes log

Permalinks never change — every post stays at /{slug}/ regardless of stream.

Articles

Just write and publish a post as normal. Any post not tagged #project or #microblog is an article. On the home it appears under Texter as a row with its date and reading time; the full archive is at /blog/ via the Alla texter → link.

Notes (#microblog)

Short dated notes — one or two sentences, micro.blog-style.

  1. Create a new post.
  2. Leave the title empty.
  3. Write one or two sentences in the body. Keep it short — ~120 characters.
  4. Add the internal tag #microblog.
  5. Publish.

Notes don't appear on the homepage — it introduces, then showcases writing and projects. The now page and dated log live at /nu/; put Nu in the primary navigation so visitors find it.

The now page (/nu/)

A proper now page in the nownownow.com tradition — a curated list of what you're focused on right now (building, reading, thinking about), not a feed.

Create a Ghost page with the slug nu and write the list in its body. It renders at the top of /nu/ under the // Nu heading, with "Uppdaterad date" beneath — the date refreshes automatically whenever you edit the page. The dated notes log follows below as // Noteringar.

If the nu page doesn't exist, /nu/ is simply the notes log. (The channel route shadows the page's own URL, so the page only ever appears here.)

Project posts (#project)

Write a post and add the internal tag #project (type #project in the post's Tags field — Ghost turns it into the internal tag hash-project). Then, to make the previews and cards work:

  • Feature image → the card/thumbnail image. Without one, a quiet // placeholder stands in.
  • Excerpt (post settings) → the one-line pitch on the home preview and the card on /projects/. Keep it to a sentence.
  • Public tags (e.g. Rust, CLI) → the mono tech labels.
  • Feature this post (admin toggle) → hand-picks the hero card at the top of /projects/; otherwise the newest project leads.

The home shows the 9 newest as compact previews in a three-column grid. The full showcase lives at /projects/: a hero card (image beside text on wide screens) above a two-column card grid, introduced by the Projects tagline theme setting.

The hello line (intro page)

The greeting at the top of the home comes from an editable Ghost page with the slug intro (Pages → New page → set the URL slug to intro):

  • Page title → the bold greeting line, e.g. Hello! Jag heter Alex.
  • Custom excerpt → the regular sentence beneath, e.g. Jag bygger små verktyg och skriver om mjukvara.
  • Page body → the full presentation, reached via Om mig →.

The hero also carries a fixed invitation line — "Ta en titt på vad jag gör just nu." — pointing visitors at the now page.

The round avatar is the intro page author's profile image (Settings → Staff → your profile picture). With none set, it falls back to assets/images/avatar.svg. If the intro page doesn't exist, the home simply omits the hello line — no error.


Setup

1. Routes (required for /blog/, /projects/, /nu/)

These three listing pages are Ghost channels defined in routes.yaml. routes.yaml is site config, not part of the theme bundle, so install it once:

  • Hosted / Ghost(Pro): Settings → Labs → Routes → upload routes.yaml.
  • Local Docker: it's already bind-mounted by docker-compose.yml; a restart picks up edits.

Without it, posts and the home page still work, but the Alla … → links 404.

The /projects/ channel orders featured posts first (that's what powers the hand-picked hero card) — if you installed an older routes.yaml, re-upload this one to get that.

2. Navigation

Set in Settings → Navigation:

  • Primary (top bar): e.g. Home → /, Blog → /blog/, Projects → /projects/, Nu → /nu/, About → /about/.
  • Secondary (footer): your social/personal links — e.g. Prenumerera → #/portal/, GitHub → https://github.com/you, Mastodon → https://mastodon.social/@you. They render in the footer's right group next to RSS, each carrying rel="me" so Mastodon (and friends) can verify them back to this site.

Facebook and X set under Settings → General → Social accounts also appear in the footer automatically when filled in.

3. Theme settings

Settings → Design → verkstad exposes:

  • Show tagline on home — off by default (the hello line stands in for it on the home page; the tagline still shows on every other page).
  • Projects tagline — the one-line introduction under the Projekt heading on /projects/ (default: "Små verktyg, teman och experiment."). Leave empty to hide it.

4. Locale

Relative dates and UI strings assume Swedish. Set Settings → General → Publication Language to sv for "för 3 dagar sedan"-style dates.


Local preview (Docker)

docker compose up -d          # start Ghost with the theme + routes bind-mounted
# http://localhost:2368/  (site)   http://localhost:2368/ghost/  (admin)
  • Template (.hbs) or routes.yaml changes: docker compose restart ghost
  • CSS changes: just refresh the browser
  • Validate the theme: npm test (runs gscan)
  • Release zip: publishing a GitHub release attaches an installable verkstad.zip automatically (a workflow validates, zips and uploads it); it can also be run by hand from the Actions tab.

Project layout

default.hbs        base layout: masthead, nav, footer, theme toggle
index.hbs          home (hello + Texter timeline + Projekt grid) & paginated archive
blog.hbs           /blog/    channel — article archive
projects.hbs       /projects/ channel — showcase (hero card + card grid)
nu.hbs             /nu/      channel — now page (from the `nu` page) + notes log
post.hbs page.hbs  reading views
tag.hbs author.hbs taxonomy archives
partials/
  navigation.hbs   primary + secondary menus
  post-card.hbs    an article row (date + title + reading time)
  project-card.hbs a showcase card (image, pitch, tech tags; hero variant)
  project-mini.hbs a home preview card (small thumb, title, tags, one-line pitch)
  micro-card.hbs   a note row (date + note)
routes.yaml        channel definitions (install separately — see Setup)
assets/css/        screen.css (tokens, layout) + code.css (reading views)
assets/js/theme.js the only JS: the dark/light toggle
package.json       config.custom theme settings + image sizes

Design tokens

All colour, spacing and type live as CSS custom properties at the top of assets/css/screen.css (--bg, --text, --heading, --accent, --muted, --space-1/2/3, --date-col, …) for both the dark and light palettes. Adjust there rather than hunting through rules.


Licensed under The Lagom License.

About

Ghost theme: a calm personal index — interleaved notes/articles timeline, project showcase, now page. System fonts, dark/light, near-zero JS.

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors