A technical publication that runs itself.
Ghost as the editorial core, a custom theme and an in-house dashboard that feeds series, hubs and front pages.
Ghost writes, the theme composes.
Front page: the series slider and the latest articles
- 257
- published posts
- 268
- tags
- 603
- URLs in the sitemap
Ghost covers what a publication needs every day: an editor, authors, tags, newsletters and a stable content API. On that base I built a Handlebars theme that understands how the site is structured: series, topic hubs and front pages assembled from tags.
The editorial team publishes from Ghost's editor without touching code. Each article reaches the front page, its series and the hubs through its tags, never through a manual step.
A lattice that draws itself.
The site has an identity of its own: blue over navy, a hexagon lattice that runs behind front pages and featured slots, and a hero slider that presents the series with a big title and one button. Here it is reproduced without images: the geometry is generated in code and the title types itself letter by letter, the way a first-time reader sees it.
Under that layer sit 13 custom Handlebars templates (front page, episode, hubs, roadmap, press kit, contact) and 24 vanilla JavaScript modules: the slider, the series player, each article's table of contents, the video modal, the front-page carousels and the search. Tailwind 4 compiled with Gulp, no frontend framework.
- 13
- custom templates
- 24
- JavaScript modules
Every episode plays the way a series should.
A series episode in cinema mode
Series get their own episode page: the video fills the screen, the text follows below and the navigation leads to the previous and next chapter without going back to the index. A cinema mode built for staying, not bouncing.
The theme builds that navigation from the order defined in the dashboard. If the team reorders a series, the episode page reflects it on the next render, without touching a single article.
Two sources, one page.
Ghost has no custom fields, every article lives in exactly one collection and its search reads title and excerpt only. Enough to write, not enough to order a series, curate a hub or decide what goes on the front page. So next to Ghost there is an in-house dashboard in Next.js with PostgreSQL: ten modules (series, tag groups, hubs, carousels, roadmap, changelog) and thirteen public endpoints the theme consumes.
The flow never changes: the team publishes in Ghost, the theme renders by tag and author on the server, and its JavaScript asks the dashboard for what Ghost does not know: the series order behind the “Episode 5 of 5” counter, each hub's sections, the front-page carousels and the roadmap. Reordering a series in the panel changes the episode page on the next render, without touching an article.
- 10
- dashboard modules
- 13
- public endpoints
Píldoras and Academia: two doors into the same content.
Píldoras gathers the short videos: one answer per video, for people who arrive from a search with a concrete question. Academia orders the long series by level and topic, for people who want to walk a full path.
Both front pages assemble themselves from tags and from the order curated in the dashboard. Publishing a new article places it in the right hub without a manual step.


An in-house panel feeds the theme.
The panel is a Next.js app on PostgreSQL with Drizzle: series, tag groups, hubs, front-page carousels, roadmap, changelog, contact, gallery, import and export, and settings. Order is set by dragging, and the analytics charts show what gets read. The team curates there what Ghost does not model, and the theme reads it at render time.
It deploys through GitHub Actions to GHCR and from there over SSH to the server; everything runs in Docker Compose containers behind Caddy with automatic TLS, on a server I also operate: deployment, backups and the day-to-day support of the publication.

Tags that become hubs.
Besides the site, I produce the video content for the DonWeb Cloud channel: long tutorials, series like the n8n course, and short píldoras for whoever arrives with one specific question. Thirty-six of those videos live embedded in the publication.
Each video enters Ghost as a post with one internal tag: #short, #serie-item or #video. The theme reads them and assembles the front pages on its own: Píldoras gathers the shorts, Academia orders the series, and every hub lists its videos by crossing its own tag with #video. Publishing a new video is publishing a post; the rest sorts itself.
- 36
- embedded videos
- 3
- internal tags
A healthy sitemap is the proof that the structure works: every series, hub and tag has its URL, and none of them returns an error.
SEO baseline from October 3, 2026
























