Themeanax logo

Introduction

Kidoo is a premium editorial Ghost theme built for kids' health, parenting and family publications. It pairs a warm, magazine-style front page with Ghost's native membership, newsletter and Portal features, so a full paid publication can be set up entirely from Ghost Admin — no code required.

This guide covers every screen and setting in the theme, in the order you will actually need them. If you are setting up a brand-new site, start with the Setup Checklist and work down.

Version

1.0.0

Built and tested against Ghost 5.x and Ghost 6.x.

Theme settings

11 options

Hero, feed and footer layouts, dark mode, newsletter, tag images and contact email.

Page templates

9 special pages

Membership, account, sign in, sign up, subscribe, welcome, contact, authors and topics.

Built with

Tailwind CSS 3

Compiled stylesheet ships with the theme — a build step is only needed if you edit the CSS.

What Kidoo gives you out of the box

  • Three homepage hero styles — a peek-through carousel, a full-width fading slider, and an editorial grid.
  • Three post feed styles — Grid, Listing and a five-tile Bento mosaic — applied across the homepage, tag and author pages.
  • A complete hand-built dark mode with a header toggle that remembers each visitor's choice.
  • Membership pricing page driven by your Ghost Tiers, plus custom sign in, sign up, account and welcome screens.
  • An FAQ block you edit as normal Ghost content using Toggle cards — no template editing.
  • Contact page with your email address pulled from theme settings.
  • A ready-made routes.yaml and a full demo content export in the package.
  • Reading progress bar, related posts, previous/next article navigation and author profile cards.
  • Accent colour and heading/body fonts follow Ghost's own Design and branding settings.

Requirements

Before installing Kidoo, make sure you have the following:

Platform

Ghost 5.0 or newer

Works on Ghost(Pro) and self-hosted Ghost. The theme declares "ghost": ">=5.0.0" and is tested on Ghost 5.x and 6.x.

Access

Ghost Admin

You need Administrator or Owner access to upload a theme and edit settings.

Browser

Any modern browser

Chrome, Firefox, Safari or Edge. Internet Explorer is not supported.

For paid memberships

A Stripe account

Only required if you intend to sell subscriptions. Free memberships and newsletters work without Stripe.

Internet connection required at page load

Kidoo loads its display fonts (Josefin Sans and Inter) from Google Fonts and the Swiper carousel library from the jsDelivr CDN. Both are fetched by the visitor's browser at page load, so the site needs public internet access to render exactly as demoed. If your site must be fully self-contained, download those two libraries into assets/ and update the tags in default.hbs.

What's Inside Your Download

Extract the package you downloaded. You will find:

kidoo/
├── kidoo.zip          ← the installable theme. Upload this to Ghost.
├── routes.yaml        ← custom routing. Upload this to Ghost too.
└── demo-content/
    ├── content-export.json  ← demo posts, pages, tags and authors
    └── IMPORT.md            ← import steps and suggested membership tiers

Two files get uploaded, not one

Kidoo needs both kidoo.zip (the theme) and routes.yaml (the URL map for the membership, contact and member pages). They are uploaded in two different places in Ghost Admin — see Installing the Theme and Special Pages & Routing.

Upload kidoo.zip, not the outer package

The file you upload to Ghost is the inner kidoo.zip. Uploading the whole downloaded package, or re-zipping an unpacked theme folder (which nests everything one level deeper), makes Ghost reject the theme with a “missing package.json” style error.

Read IMPORT.md as well

demo-content/IMPORT.md repeats the import and routing steps in short form and adds the exact tier names, prices and benefits used in the live demo — handy if you want to reproduce the demo's pricing page exactly.

Installing the Theme

  1. 1 Extract the downloaded package on your computer so you can see kidoo.zip.
  2. 2 Log in to Ghost Admin and go to Settings → Design and branding.
  3. 3 Click Change theme, then Upload theme in the top-right corner.
  4. 4 Select kidoo.zip and wait for the upload to finish.
  5. 5 Click Activate. Kidoo is now live on your publication.

About upload warnings

Ghost may list a few non-blocking recommendations after upload (for example about optional helpers). These are advisory only — as long as Ghost offers the Activate button, the theme installed correctly.

Updating to a newer version later

Upload the new kidoo.zip the same way and activate it. Your posts, pages, navigation, tiers and members are stored in Ghost, not in the theme, so nothing is lost. Theme settings under Design and branding → Custom are preserved as long as the setting names have not changed between versions.

Before updating, save your edits

If you edited the theme files yourself, keep a copy. Uploading a new version replaces the whole theme and your changes are overwritten.

Setup Checklist

Kidoo looks its best once a handful of Ghost settings are in place. Work down this list in order — each item links to the section that explains it in full.

  1. 1 Install and activate the theme.
  2. 2 Upload routes.yaml. This maps /membership/, /contact/, /signin/ and the other member URLs to their templates. See Special Pages & Routing.
  3. 3 Set your brand. Upload a logo and publication icon, and pick your accent colour under Settings → Design and branding → Brand. See Brand, Accent Colour & Typography.
  4. 4 Mark some posts as Featured. Every hero layout is built from featured posts only — without them the top of the homepage shows just your site title. See Homepage Structure.
  5. 5 Create the special pages. Membership, Contact, Authors and Topics all need a matching page to exist. See Special Pages & Routing.
  6. 6 Set up navigation. Primary links for the header, secondary links for the footer columns. See Primary Navigation and Footer Layouts.
  7. 7 Choose your layouts. Hero, post feed, header and footer styles under Design and branding → Custom. See Theme Settings Reference.
  8. 8 Fill in your contact email. It is a theme setting, not page content, and it is also where the contact form sends. See Contact Page.
  9. 9 Set up memberships. Create your tiers, connect Stripe, and add an FAQ page if you want one. See Membership, Tiers & Portal.
  10. 10 Turn on your newsletter under Settings → Email newsletter so the subscribe forms deliver mail.

Fastest possible start

Import the demo content first, then work down this list. The import creates featured posts, tags, authors and most of the special pages for you, so you can see the finished layout immediately and swap in your own content piece by piece.

Importing the Demo Content

Importing demo-content/content-export.json reproduces the theme demo — sample posts, tags, authors and all of the special pages — so you can see how everything fits together before swapping in your own content.

What the file contains

  • Posts — parenting guides, kids' health features, family activities and nutrition pieces, several already marked as Featured so the hero works immediately.
  • Authors — Dr. Emily Vance, Sarah Jenkins and Michael Thorne, each with a bio so the Expert Voices block fills in.
  • Tags — Parenting, Kids Health, Nutrition, Activities, Education and Family.
  • Pages — every special page, already given the correct slug: authors, tags, membership, contact, signin, signup, account, welcome and subscribe.
  1. 1 In Ghost Admin go to Settings → Advanced → Import/export.
  2. 2 Under Import content, click Choose file (or drag the file onto the area).
  3. 3 Select content-export.json from the demo-content/ folder.
  4. 4 Wait for Ghost to finish processing, then reload your site.

Import adds to your site, it does not replace it

Demo posts, pages, tags and authors are added alongside whatever you already have. On a site with real content, review and delete the demo items afterwards — filter by tag or sort by date in the Posts list to find them quickly.

Images in the demo content

A Ghost JSON export stores text and metadata, not image files. Demo feature images therefore point at the original demo URLs, and some may not load on your site. Replace them with your own images: open a post, click the feature image, and upload a replacement.

What the import does not carry over

Theme settings (hero layout, footer layout, contact email), navigation menus, routing, tiers and Stripe are all Ghost site settings rather than content, so they are not part of a content import. Set those yourself using the Setup Checklist — and remember to upload routes.yaml separately, or the imported member pages will not be reachable at their intended URLs.

Special Pages & Routing

Kidoo ships with purpose-built templates for the pages a membership publication needs — pricing, contact, member screens and the two directories. Two things connect them: a page in Ghost, and the routes.yaml file included in your download, which tells Ghost which template serves which URL.

Step 1 — Upload routes.yaml

  1. 1 In Ghost Admin go to Settings → Advanced → Routes (older versions: Settings → Labs → Routes).
  2. 2 Click Upload routes YAML and choose the routes.yaml from your package.
  3. 3 Ghost reloads its routing straight away — no restart needed.

routes.yaml replaces your whole routing configuration

The file you upload becomes the complete definition of your site's URLs — it does not merge with what was there before. Kidoo's file already includes the collections and taxonomies blocks that keep your homepage, tag pages and author pages working. If you have already customised your routing, download the existing file first and merge the two by hand rather than overwriting.

Step 2 — Create the pages

Four of the routes are bound to a Ghost page, so that page has to exist or the URL returns 404. Create each one under Pages → New page, set the Page URL in the settings panel to the exact slug below, and publish. There is no template dropdown to choose — the routing does that.

URLPage slug neededTemplateWhat visitors see
/membership/membershippage-membershipPricing cards built from your Ghost tiers, plus the FAQ block. Headings are set by the template — your page title and body text are not shown.
/contact/contactpage-contactTwo-column contact page. Your page title and body text are shown, alongside your contact email and a message form.
/authors/authorspage-authors“Contributors” directory listing every author with a bio, photo and post count.
/tags/tagspage-tags“All Topics” directory of your public tags, ordered by number of posts.

The remaining routes are self-contained — they read from Ghost's member state rather than a page, so no page is required:

URLTemplateWhat visitors see
/signin/signinSplit-screen sign-in screen using your publication cover image.
/signup/signupSplit-screen sign-up screen.
/subscribe/page-subscribeAn alternative “Create your account” signup page.
/account/accountMember dashboard — plan, email and Portal links for billing and profile. Non-members see a “Members Only” prompt.
/welcome/welcomePost-signup thank-you screen with three recent posts. Greets members by name when signed in.

The header always links to /membership/, /account/, /signin/ and /signup/

These URLs are built into the header, the homepage call-to-action and the mobile drawer. Uploading routes.yaml is what makes them resolve.

Fix needed: the /contact/ route

The routes.yaml in the package maps the contact URL without binding the page to it:

  /contact/: page-contact

The contact template renders everything inside a {{#page}} block, so with no page bound to the route there is no content to render and /contact/ returns a page that is empty between the header and footer — even though your contact page exists and is published. Edit routes.yaml before uploading it and replace that line with:

  /contact/:
    template: page-contact
    data: page.contact

How to spot this

Open /contact/ and you will see your site header and footer with nothing between them. The other data-bound routes — /membership/, /tags/, /authors/ — already carry their binding and render correctly, which is the giveaway that the contact route is missing one.

The full corrected routes.yaml

If you would rather paste the whole file, this is Kidoo's routing with the contact fix already applied:

routes:
  /authors/:
    template: page-authors
    data: page.authors
  /tags/:
    template: page-tags
    data: page.tags
  /membership/:
    template: page-membership
    data: page.membership
  /contact/:
    template: page-contact
    data: page.contact
  /signin/: signin
  /signup/: signup
  /account/: account
  /welcome/: welcome
  /subscribe/: page-subscribe

collections:
  /:
    permalink: /{slug}/
    template: index

taxonomies:
  tag: /tag/{slug}/
  author: /author/{slug}/

Running without routes.yaml

Ghost also matches a page to a template by slug on its own, so /membership/, /contact/, /authors/, /tags/, /account/, /welcome/ and /subscribe/ work from the pages alone. Only /signin/ and /signup/ genuinely need the routing, because their templates are not named page-signin / page-signup. If you skip the file entirely, use Ghost Portal's built-in sign-in and sign-up overlays instead — the header links open them.

Theme Settings Reference

Kidoo adds 11 settings to Ghost Admin. Find them under Settings → Design and branding → Customise → Custom. Changes save instantly and apply to the live site — no rebuild needed.

Site-wide

Color scheme Site
Type: Select Options: Light / Dark / Auto Default: Auto

Sets the colour mode a first-time visitor sees. Auto follows their operating system preference. The header toggle stays available in all three modes — see Dark Mode.

Header style Site
Type: Select Options: Default / Minimal Navigation Default: Default

Default shows your primary menu across the header on desktop. Minimal Navigation hides it at every screen size and moves it into the slide-out drawer.

Footer layout Site
Type: Select Options: Multi-column / Centered / Newsletter split Default: Multi-column

Chooses between a three-column link footer, a compact centred footer, or a footer with a newsletter signup form. See Footer Layouts.

Show tag featured image Site
Type: Toggle Options: On / Off Default: On

Shows or hides tag artwork in all three places it appears: the homepage Popular Topics cards, the All Topics directory, and the background of tag archive headers. Switch it off for a cleaner, text-led look, or if your tags have no images.

Homepage

Hero layout Homepage
Type: Select Options: Default / Hero Slider / Premium Grid Default: Default

Chooses the featured-posts presentation at the top of the homepage. All three build from posts marked Featured. See Hero Layouts.

Post layout Homepage + archives
Type: Select Options: Grid / Listing / Bento Default: Grid

Sets the card style for the “Latest Stories” feed. Despite the Homepage grouping in Ghost Admin, this setting also drives tag pages, author pages and the related-posts block on articles.

Show newsletter CTA Homepage
Type: Toggle Options: On / Off Default: On

Shows or hides the large newsletter signup block near the bottom of the homepage.

Newsletter CTA text Homepage + footer
Type: Text Default: (empty)

Custom heading for the newsletter block. Left empty, the homepage falls back to “Join Modern Families Reading [your site title]” and the Newsletter-split footer to “Subscribe to our newsletter”.

Article pages

Show related posts Post
Type: Toggle Options: On / Off Default: On

Shows up to three more articles that share the post's primary tag, below the article. Nothing renders if the post has no tag or no other post shares it.

Show author section Post
Type: Toggle Options: On / Off Default: On

Shows the author profile card — photo, bio and social links — at the end of the article. Fill in author bios under Settings → Staff for this to look complete.

Contact details

Contact email Contact page
Type: Text Default: hello@kidoo.com

Shown as the “Email Us” address on the contact page, and used as the destination for the contact form. Clearing it hides the email block and leaves the form with nowhere to send.

Replace the contact email default

hello@kidoo.com is a placeholder that ships with the theme. If you leave it, it appears on your live contact page and every form submission is addressed to it.

Homepage Structure

The Kidoo homepage is a fixed sequence of eight blocks. Two of them are controlled by theme settings; the rest fill themselves from your content and hide automatically when there is nothing to show.

#BlockWhere the content comes from
1HeroYour site title and description, then up to 5 posts marked Featured. Style set by the Hero layout setting.
2Editor's ChoiceYour 6 most recent posts, in a three-column grid. Always this style.
3Popular TopicsYour 12 public tags with the most posts, each showing its post count and — unless Show tag featured image is off — its artwork, plus a “View All Topics” button to /tags/.
4Latest StoriesYour 5 most recent posts. Style set by the Post layout setting (Grid, Listing or Bento).
5Expert VoicesUp to 4 authors who have a bio filled in, plus an “All authors” link to /authors/.
6Editorial quoteA fixed pull-quote. Editing it requires a template change — see Fixed Text Reference.
7NewsletterSignup form. Toggled by Show newsletter CTA, headline from Newsletter CTA text.
8Membership call-to-actionA fixed promo banner linking to /membership/ and /signup/.

The hero needs featured posts

All three hero layouts read posts filtered to Featured only. With no featured posts, the top of your homepage shows the site title and description and nothing else. To fix: open a post, go to the settings panel, and switch on Feature this post. Feature between 3 and 5 posts for the best result.

Why blocks disappear

Every block hides itself rather than rendering empty. If one is missing, check the matching content:

  • No hero cards — no posts are marked Featured.
  • No Popular Topics — you have no public tags, or all your tags are internal (names starting with #).
  • No Expert Voices — no author has a bio. Add one under Settings → Staff.
  • No Editor's Choice or Latest Stories — you have no published posts.

The homepage does not paginate

Each block requests a fixed number of posts, so the homepage never grows a “load more” button and never shows page 2. The posts_per_page value of 9 in the theme applies to paginated archives such as tag pages. Point visitors at your tag pages or /tags/ to browse the full archive.

Hero Layouts

Set this under Design and branding → Custom → Hero layout. All three open with the same masthead — your site title in large display type, your site description beneath it — and then present up to 5 Featured posts in different ways.

Default

Peek-through carousel

A centred slide with the neighbouring slides peeking in at the edges. Autoplays every 6 seconds, has previous/next arrows, and is swipeable on touch screens. Shows the post's primary tag, title and meta over a full-bleed image.

Hero Slider

Full-width fading slider

One large rounded slide at a time, crossfading between featured posts every 6 seconds. Autoplay pauses while the pointer is over the slider. The tallest of the three layouts — good when your feature images are strong.

Premium Grid

Editorial mosaic

A four-column grid mixing image cards with solid sage and terracotta colour tiles. Static — no autoplay or swiping — so every featured post is visible at once. Best with a full set of 5 featured posts.

Getting the best result

Use landscape feature images at 2000px wide or more — the hero requests the largest available size. Give each featured post a primary tag so the category badge appears, and add a custom excerpt so the summary text reads well rather than being cut from the article body.

Carousels need JavaScript

Default and Hero Slider are powered by Swiper, loaded from a CDN. If it cannot load, the slides stack vertically instead of sliding — content stays readable. Premium Grid has no such dependency.

Post Feed Layouts

Set this under Design and branding → Custom → Post layout. It controls how post cards are drawn in four places: the homepage Latest Stories block, tag pages, author pages, and the related posts block under each article.

Grid

Three-column cards

The default. Equal-sized cards, each with feature image, tag pill, title, excerpt, author and reading time. Drops to two columns on tablet and one on mobile.

Listing

Horizontal rows

Wide rows with a thumbnail on one side and text on the other. Fits more headlines on screen — the best choice for news-style or high-volume publications.

Bento

Five-tile mosaic

An asymmetric block: one large hero tile, two image tiles, and two solid colour tiles in sage and terracotta. Designed around exactly 5 posts.

About Bento

The Bento mosaic is composed for the homepage's five most recent posts, where each of the five positions has its own design. On tag and author pages — which list many more posts — Grid and Listing give more predictable results.

Blocks this setting does not affect

Editor's Choice on the homepage and the Popular Topics and Expert Voices grids always keep their own layout, by design, so the page keeps its editorial rhythm whichever feed style you pick.

Header & Mobile Navigation

The header is fixed to the top of the screen on every page and gains a subtle shadow once the visitor scrolls past 60 pixels.

What the header contains

  • Left — menu button (mobile, or always in Minimal Navigation) and your logo. With no logo uploaded, your site title is set in wide-tracked display capitals.
  • Centre — your primary navigation links, on desktop, in the Default header style.
  • Right — search, the dark mode toggle, and member links: Sign In plus a Subscribe button for visitors, or Account for signed-in members.

The two header styles

Default

Full navigation

Your primary menu sits across the header on screens 1024px and wider. Below that it collapses into the drawer automatically.

Minimal Navigation

Drawer at all sizes

The menu is hidden on every screen size and lives in the slide-out drawer, which opens from the left. Gives a clean, distraction-free header on desktop too.

The mobile drawer

The drawer holds your full primary menu, the dark mode toggle and member links. It is built for keyboard and screen-reader use:

  • Opens from the menu button; closes on the close button, on the backdrop, on Esc, or when a link is tapped.
  • Focus moves into the drawer on open, is trapped inside while it is open, and returns to the menu button on close.
  • Page scrolling is locked behind the drawer so the page underneath does not move.

Upload a logo sized for the header

The header renders your logo at 24px tall and scales the width to match. A wide, transparent PNG or SVG works best. The header background is always dark, so use a light or white logo.

Primary Navigation

Your header menu comes from Settings → Navigation → Primary navigation. Add a label and a URL for each link, drag to reorder, and save. The same list feeds both the desktop header and the mobile drawer, and the link for the page being viewed is highlighted automatically.

A good starting menu

Home         →  /
Journal      →  /tag/journal/
Topics       →  /tags/
Contributors →  /authors/
Membership   →  /membership/
Contact      →  /contact/

Kidoo's header menu is a single flat row

The theme renders primary navigation as one level of links, with no drop-down submenus. Prefixing a label with a hyphen — a convention some other Ghost themes use to nest items — has no effect here: the hyphen is displayed as part of the label. Keep to 4–6 top-level links so the row fits comfortably beside the logo and header buttons.

Room for more links

If you need to offer more than about six destinations, put the extras in the footer via Secondary navigation, which supports three titled columns — or switch Header style to Minimal Navigation, where the drawer gives every link a full-width row.

Footer Layouts

Set this under Design and branding → Custom → Footer layout. Every layout keeps the same bottom bar: your copyright line and a “Published with Ghost” credit.

Multi-column

Brand block + 3 link columns

The default. Your logo, site description and social icons on the left; up to three titled link columns built from Secondary navigation on the right.

Centered

Compact and centred

Logo, description and a single centred row of secondary navigation links. Best for small sites with only a few footer links.

Newsletter split

Brand + signup form

Your brand on the left, a newsletter signup form on the right. Uses your Newsletter CTA text as the heading, and shows a thank-you line to members who have already subscribed.

Building the footer link columns

In the Multi-column layout, columns are assembled from Settings → Navigation → Secondary navigation. A link whose URL is ## becomes a column heading; every link after it goes into that column, until the next ## starts a new one.

Explore      →  ##          ← starts column 1
Home         →  /
Topics       →  /tags/
Membership   →  /membership/
Company      →  ##          ← starts column 2
About        →  /about/
Contact      →  /contact/
Legal        →  ##          ← starts column 3
Privacy      →  /privacy/
Terms        →  /terms/

Three columns is the maximum

The footer has room for exactly three columns. If you add a fourth ## heading, its links are appended to the third column instead of creating a new one. Columns with no links are hidden.

Start with a ## heading

Links added before the first ## marker have no column to go into and are not displayed. Always make the first secondary navigation item a heading. If Secondary navigation is empty, the footer shows a short reminder in its place — this is visible on your live site, so set the links up before launch.

Footer social icons

The Multi-column footer shows up to two icons:

  • Twitter/X — appears when you set a Twitter handle under Settings → Social accounts.
  • RSS — always shown, linking to your /rss/ feed.

Adding other social networks

Ghost stores only Facebook and Twitter handles, and the footer renders Twitter and RSS. To add Instagram, YouTube or others, copy one of the existing icon links in partials/components/footer.hbs and swap in the network's URL and SVG.

Brand, Accent Colour & Typography

Kidoo follows Ghost's native brand settings, so most of its look can be retuned without touching a file. Go to Settings → Design and branding → Brand.

Accent colour

Kidoo's signature terracotta is your Ghost accent colour. Change it and every highlight in the theme follows: buttons, tag pills, link hovers, section labels, the FAQ chevrons, checkmarks, the reading progress bar and the coloured glow beneath primary buttons.

  1. 1 Open Settings → Design and branding → Brand.
  2. 2 Click the Accent color swatch and pick a colour, or type a hex value such as #D66F56 — the theme's own default.
  3. 3 Save. The change appears immediately across the whole site.

Choosing an accent colour that works

The accent is used for white text on coloured buttons as well as for coloured text on light backgrounds, so a mid-to-deep tone reads best in both. Very pale colours make button labels hard to read; very dark ones lose the warm editorial feel. Warm tones — terracotta, rust, amber, deep coral — suit the theme's palette.

Logo, icon and cover image

  • Publication logo — shown in the header at 24px tall and in the footer. Use a light or white version: both backgrounds are dark.
  • Publication icon — your browser tab favicon.
  • Publication cover — used as the background artwork on the sign in, sign up and subscribe screens.
  • Site description — appears under your title in the homepage masthead and in the footer, so keep it to one strong line.

Fonts

Kidoo ships with Josefin Sans for headings and Inter for body text. Both respect Ghost's font pickers: if you choose a heading or body font in Design and branding → Typography, the theme uses your choice instead. Leave the pickers on their defaults to keep the demo typography.

The rest of the palette

These supporting colours are part of the theme's design and are not exposed as settings — changing them means editing tailwind.config.cjs:

NameValueUsed for
terracottayour accent colourAll highlights, buttons and active states
ink#181B1FHeader, footer and dark text
paper#FAF8F5Light-mode page background
sand#F2EDE4Alternating light section backgrounds
sage#4C725EGreen accent tiles in Bento and Premium Grid
dark-surface#111315Dark-mode page background

Dark Mode

Kidoo has a complete hand-built dark theme — not an automatic filter — covering every template, card, form and image overlay. A sun/moon button in the header lets visitors switch at any time, and their choice is remembered in their browser for future visits.

The Color scheme setting

Under Design and branding → Custom → Color scheme, this sets the mode a first-time visitor sees:

Auto

Follow the visitor's device

Recommended. Matches the light or dark preference set in their operating system.

Light

Start in light mode

Everyone opens the site in light mode, whatever their device is set to.

Dark

Start in dark mode

Everyone opens the site in dark mode, whatever their device is set to.

The toggle is always available

This setting chooses the starting point, not a lock. The header toggle is present in all three modes, and once a visitor uses it their saved choice takes priority over the setting on later visits. To remove the switch entirely, delete the [data-theme-toggle] button from partials/components/header.hbs and partials/components/mobile-menu.hbs.

Which setting wins

When a page loads, Kidoo decides the mode in this order:

  1. 1 The visitor's own choice. Once someone uses the header toggle, that choice is stored in their browser and takes priority on every later visit.
  2. 2 Your Color scheme setting, for anyone who has never used the toggle.
  3. 3 Their device preference, when the setting is Auto.

Changing the setting does not override existing visitors

Because a saved choice wins, switching Color scheme from Auto to Dark changes what new visitors see, but not what returning visitors who have already used the toggle see. There is no way to reset their stored preference from Ghost Admin.

Previewing in Ghost Admin works properly

The theme detects Ghost's design preview — both the preview frame and its ?color_scheme= parameter — and shows the scheme being previewed rather than whatever you last picked with the toggle. So the preview pane in Design and branding is trustworthy, even if your own browser is set to the opposite mode.

Testing dark mode

Click the header toggle, or open the site in a private window with Color scheme set to Dark — a private window has no saved preference, so you see exactly what a first-time visitor sees. When checking your own content, look at anything you uploaded with a transparent background: logos and diagrams drawn in dark ink can vanish against a dark surface. Keep a light version of your logo for the header, which is dark in both modes.

The Article Page

Each post is laid out in this order. Everything fills from the post itself, so writing a complete post in Ghost is all that is needed.

ElementComes fromNotes
Reading progress barautomaticA thin accent-coloured bar across the top, tracking scroll position.
Tag badgeprimary tagThe post's first tag. Hidden if the post has no tags.
Title and summarytitle + excerptThe summary uses your custom excerpt — set it in the post settings panel for a clean, deliberate standfirst.
Bylineauthor, date, reading timeReading time is calculated by Ghost from the article length.
Feature imagefeature imageDisplayed full-width. An image caption appears beneath it, and alt text is used for accessibility.
Article bodythe editorAll Ghost cards are styled: headings, quotes, bookmarks, galleries, embeds, buttons, callouts and toggles.
Author cardstaff profilePhoto, bio and social links. Toggled by Show author section.
CommentsGhost commentsAppears only when comments are enabled under Settings → Comments.
Share linksautomaticShare the article to social networks.
Previous / nextpublish orderLarge linked cards to the neighbouring articles, with their feature images faded in behind.
Related postsprimary tagUp to three more posts sharing the primary tag. Toggled by Show related posts.

Getting the most out of it

  • Always set a feature image. It is used on the article page, in every feed card, and in social previews.
  • Write a custom excerpt. Without one, Ghost cuts the opening lines of the article, which rarely reads as a summary.
  • Tag every post. The first tag drives the badge, the related-posts block and the tag pages.
  • Fill in author bios under Settings → Staff — the author card and the homepage Expert Voices block both depend on them.

Members-only content

Set a post's visibility to members or a specific tier in the post settings panel. Ghost truncates the content and Kidoo shows a styled upgrade prompt in its place, linking through to signup. Test it in a private window — as a signed-in admin you always see the full post.

Tag, Author & Archive Pages

Tag pages

Reached at /tag/your-tag/ and generated by Ghost for every tag you use. Each opens with a header carrying the tag's feature image, name, description and article count, followed by the article feed in your chosen Post layout, then a “more topics” strip of six other popular tags.

Tag pages are paginated at 9 posts per page. Fill in each tag's description and feature image under Settings → Tags — they are what make these pages look designed rather than generated.

Turning tag artwork off

The Show tag featured image setting hides tag images in all three places at once — the tag archive header background, the homepage Popular Topics cards and the All Topics directory. Switch it off if you have not given your tags images, since the cards fall back to a plain gradient block.

Author pages

Reached at /author/name/. Shows the author's photo, bio, social links and article count, then all of their published articles on one page — author pages are not paginated.

The two directory pages

Page slug: tags

All Topics

A grid of every public tag with its image and post count, ordered by number of posts. Linked from the header, the footer and the homepage “View All Topics” button.

Page slug: authors

Contributors

A grid of every author with photo, bio and post count. Linked from the homepage “All authors” button.

Internal tags stay hidden

Tags whose name begins with # are internal in Ghost and never appear in the Popular Topics block or the All Topics directory. Use them freely for editorial workflow.

Error pages

Kidoo includes designed 404, 403 and 500 pages. The 404 page offers a search button so a visitor who lands on a dead link can find what they wanted.

Membership, Tiers & Portal

Kidoo is built around Ghost's native membership system. You define your tiers and prices in Ghost Admin; the theme renders them. There is nothing to configure in the theme itself.

1. Turn on memberships

  1. 1 Go to Settings → Membership (older versions: Settings → Portal).
  2. 2 Choose who can sign up — anyone, invite only, or nobody.
  3. 3 To sell subscriptions, click Connect with Stripe and complete the connection. Free memberships and newsletters work without it.

2. Create your tiers

  1. 1 Under Settings → Tiers, edit the Free tier's name, description and benefits.
  2. 2 Click Add tier for each paid level. Give it a name, description, monthly and yearly prices, and a list of benefits.
  3. 3 Make sure each tier you want on the pricing page is set to Public visibility.

3. Create the membership page

Add a page with the URL slug membership and publish it. The template then builds the pricing section automatically:

  • One card per public tier, in a row of up to three.
  • Each card shows the tier name, price with your currency, description and a checkmarked benefits list.
  • Paid tiers get an “Unlock” button that opens Ghost Portal at the right checkout step; the free tier gets “Sign Up Free”.
  • Signed-in members see a line at the top linking to their account page instead of a second signup prompt.

The membership page ignores its own title and body text

Its heading (“Choose Your Plan”) and introduction are set by the template, and anything you type into the editor on that page is not displayed. Everything visitors read comes from your tier definitions and the FAQ page — see Membership FAQ.

Member screens

PageSlugWhat it does
AccountaccountShows the signed-in member their plan and email, with Portal buttons to change plan, manage billing and edit their profile. Non-members see a “Members Only” prompt.
WelcomewelcomeThank-you page after signup, greeting members by name and offering three recent posts to start with. Set this as your welcome page in each tier's settings.
Sign in / Sign up/signin/ / /signup/Split-screen screens using your publication cover image. These two need the routes.yaml step — see Special Pages & Routing.
SubscribesubscribeAn alternative “Create your account” signup page, if you prefer a page to the Portal overlay.

A ready-made tier structure

demo-content/IMPORT.md lists the exact three tiers used in the live demo — Free Reader, Family Supporter ($5/month, $49/year) and Premium Family ($15/month, $149/year) — with their descriptions and benefit lists. Copy them as a starting point and adjust the wording and prices to your publication.

Test the whole flow before launch

In a private browser window, sign up for the free tier with a real address you can read, click the magic link, and check that the welcome page, account page and member state in the header all behave. With Stripe connected, run a test purchase in Stripe test mode before going live.

Membership FAQ

The FAQ section at the bottom of the membership page is normal Ghost content, not template code. You write it in the editor using Toggle cards, and the theme picks it up automatically.

Step 1 — Create the FAQ page

  1. 1 Go to Pages → New page.
  2. 2 Give it a title — this becomes the visible heading of the FAQ section, so something like “Frequently Asked Questions” works well.
  3. 3 In the settings panel, set Page URL to exactly membership-faq.

Step 2 — Add your questions

  1. 1 In the editor, press + (or type /toggle) and choose the Toggle card.
  2. 2 Type the question in the top field and the answer in the panel beneath.
  3. 3 Repeat for each question, then click Publish.

Open /membership/ and your questions appear as an accordion, styled to match the theme with accent-coloured chevrons. Answers open and close on click, and work with keyboard Enter and Space.

The slug must be exactly membership-faq

The template looks the page up by that slug. membership-faqs, faq or membership-faq-2 will not be found. Ghost also appends a number if the slug is already taken — so after publishing, reopen the settings panel and confirm the URL still reads membership-faq.

Managing your FAQs

  • Add — insert another Toggle card anywhere on the page.
  • Edit — change the text in the card; it updates on the membership page as soon as you update the page.
  • Reorder — drag cards up or down in the editor.
  • Remove — select the card and press delete.

The section hides itself when there is nothing to show

If the membership-faq page is missing, in draft, or empty, the whole FAQ section is left out of the membership page cleanly — no stray heading or gap. To hide the FAQ temporarily, set the page back to draft.

Toggle cards work everywhere

The same accordion styling applies to Toggle cards in any post or page, so you can build FAQ blocks anywhere on your site — not only on the membership page.

Contact Page

Create a page with the URL slug contact and Kidoo renders a two-column contact layout.

Setting it up

  1. 1 Go to Pages → New page and title it “Contact”.
  2. 2 Set Page URL to contact in the settings panel.
  3. 3 Optionally add an intro in the editor — it appears at the top of the left column under an “Information” label.
  4. 4 Optionally add a custom excerpt in the settings panel — it appears as the subtitle beneath the page heading.
  5. 5 Fill in Contact email under Design and branding → Custom.
  6. 6 Publish.

What appears where

Left column

Your details

Your editor content, then three detail blocks with icons: Email Us from the theme setting, plus Response Time and Support Hours.

Right column

Send a Message form

A card with name, email and message fields, and a Send Message button.

If your contact page is blank, check routes.yaml

A contact page that shows only the header and footer with nothing between them means the /contact/ route is missing its page binding. This affects the routes.yaml as shipped — see the fix in Special Pages & Routing.

The form opens the visitor's email app

The contact form is a mailto: form: submitting it opens the visitor's own email application with the details filled in, and they must press send themselves. Nothing is delivered by your server, and no submissions are stored. Visitors on devices with no mail app configured — common on shared and mobile browsers — will not be able to send. If you need reliable delivery, embed a form from a service such as Formspree, Tally or Google Forms in the page editor and remove the built-in form from page-contact.hbs.

Response Time and Support Hours are fixed

These two blocks read “Within 24–48 Hours” and “Monday – Friday, 9:00am – 5:00pm”. They are written into the template rather than exposed as settings — see Fixed Text Reference to change or remove them.

Adding a postal address

Kidoo has no address setting — the three detail blocks are email, response time and support hours. To show an address, type it into the page in the Ghost editor: your editor content is rendered at the top of the left column, directly above the detail blocks.

Search

The magnifying-glass button in the header opens Ghost's built-in search overlay. Visitors can search across your posts, pages, tags and authors, with results appearing as they type. The same search is offered on the 404 page so a bad link is still a route into your content.

Nothing to configure

Search is provided by Ghost itself and indexes your content automatically as you publish — there is no plugin, API key or setting to enable. It runs in the visitor's browser, so it stays fast and adds no load to your site.

If the search button does nothing

Search needs Ghost's own scripts, which are injected through the {{ghost_head}} and {{ghost_foot}} tags. If you have edited default.hbs and removed either tag, put it back. Also check that no code injection or content-blocking extension is stopping Ghost's scripts from loading, and confirm search is enabled under Settings → Advanced.

Newsletters & Signup Forms

Kidoo puts Ghost signup forms in three places. All of them subscribe the visitor to your Ghost newsletter — no third-party mailing list is involved.

Homepage

Newsletter block

A large two-column block with name and email fields and a benefits list. Toggled by Show newsletter CTA.

Footer

Newsletter split layout

A compact single-field form, shown when Footer layout is set to Newsletter split.

Member pages

Sign up & subscribe

Full signup screens at /signup/ and /subscribe/.

Making sure the emails arrive

  1. 1 Go to Settings → Email newsletter and check your newsletter is enabled.
  2. 2 Set the sender name and address members will see.
  3. 3 On a self-hosted install, configure Mailgun for bulk newsletter delivery. Ghost(Pro) handles this for you.
  4. 4 Test by subscribing with a real address in a private window and confirming the magic link email arrives.

Members see a thank-you instead of a form

Every signup form checks whether the visitor is already a member and swaps in a short confirmation message if so — you will not see the forms once signed in. Use a private window to check them.

Write your own headline

Set Newsletter CTA text under Design and branding → Custom to replace the default headline on both the homepage block and the Newsletter-split footer. A specific promise — “Weekly, evidence-based parenting notes” — converts better than “Subscribe to our newsletter”.

Theme File Structure

For developers customising the theme, here is what is inside kidoo.zip:

kidoo/
├── assets/
│   ├── css/source.css        Tailwind source — edit this
│   ├── css/theme.css         Compiled output — do not edit by hand
│   └── js/theme.js           Dark mode, carousels, drawer, accordions, footer columns
├── partials/
│   ├── components/
│   │   ├── header.hbs            hero-default.hbs
│   │   ├── footer.hbs            hero-slider.hbs
│   │   ├── mobile-menu.hbs       hero-premium-grid.hbs
│   │   ├── post-card.hbs         post-listing.hbs
│   │   ├── post-bento.hbs        post-listing-item.hbs
│   │   └── author-card.hbs
│   ├── navigation.hbs        Header, drawer and footer menus
│   └── pagination.hbs
├── default.hbs               Site shell — head, header, footer, scripts
├── index.hbs                 Homepage
├── post.hbs                  page.hbs
├── tag.hbs                   author.hbs
├── page-membership.hbs       page-contact.hbs
├── page-account.hbs          page-welcome.hbs
├── page-authors.hbs          page-tags.hbs
├── page-subscribe.hbs
├── signin.hbs                signup.hbs
├── membership.hbs            account.hbs        welcome.hbs
├── error.hbs                 error-404.hbs
├── error-403.hbs             error-500.hbs
├── package.json              Theme settings, image sizes, posts per page
├── routes.yaml               Uploaded separately in Ghost Admin, not read from here
└── tailwind.config.cjs       Colours, fonts, type scale, shadows

Why some templates appear twice

membership.hbs, account.hbs and welcome.hbs are copies of their page- counterparts. The page- versions are what Ghost picks up from a page slug; the plain versions exist so the same designs can be reached through a custom routes.yaml. If you edit one, edit its twin too, or the two routes will drift apart.

Key configuration values in package.json

  • posts_per_page9. Controls paginated archives such as tag pages.
  • image_sizes — the responsive image widths Ghost generates, from 160px to 2000px.
  • card_assetstrue, so Ghost includes styles for all editor cards.
  • custom — the 11 theme settings that appear in Ghost Admin.

routes.yaml is not loaded from the theme folder

Ghost reads routing from its own settings, not from the theme. A routes.yaml sitting in the theme directory does nothing until you upload it under Settings → Advanced → Routes. It is shipped alongside the theme purely for convenience.

Editing & Rebuilding the CSS

The theme's stylesheet is generated by Tailwind CSS. The compiled assets/css/theme.css ships inside the zip, so the theme works with no build step — you only need the toolchain if you intend to change styles.

Setting up

  1. 1 Unzip kidoo.zip into a working folder.
  2. 2 Run npm install to fetch Tailwind, PostCSS and Autoprefixer.
  3. 3 Run npm run dev to watch and rebuild as you edit, or npm run build for a minified production build.
  4. 4 Re-zip the theme folder and upload it to Ghost.

Never edit theme.css directly

assets/css/theme.css is generated output — the next build overwrites it. Put your changes in assets/css/source.css (component classes and custom CSS) or tailwind.config.cjs (colours, fonts, type scale, shadows), then rebuild.

Where to change what

GoalFile to edit
Colours, fonts, type scale, shadowstailwind.config.cjs
Reusable classes — buttons, cards, form inputs, pillsassets/css/source.css
Interactive behaviour — carousels, drawer, accordions, dark modeassets/js/theme.js
Page structure and content blocksthe relevant .hbs template
Adding or renaming a theme settingpackage.json (the custom block)

Re-zipping correctly

Select the theme's contents and compress them, so package.json sits at the top level of the zip. Compressing the enclosing folder adds a level of nesting and Ghost will reject the upload.

Small tweaks need no build at all

For a handful of CSS overrides, paste them into Settings → Code injection → Site header inside a <style> tag. They survive theme updates and need no toolchain — ideal for small colour or spacing corrections.

Fixed Text Reference

Most text in Kidoo comes from your Ghost content and settings. A few editorial strings are written into the templates as part of the design. They are listed here with their location, so you can change them deliberately if you want to.

TextWhere it appearsFile to edit
“Editor's Choice”, “Popular Topics”, “Expert Voices” and their labelsHomepage section headingsindex.hbs
“Children are not things to be molded, but people to be unfolded.”Homepage pull-quoteindex.hbs
“Deepen Your Parenting Journey” promo bannerBottom of the homepageindex.hbs
Newsletter benefits list and privacy lineHomepage newsletter blockindex.hbs
“Choose Your Plan” and its introductionMembership page headerpage-membership.hbs and membership.hbs
“Within 24–48 Hours” and “Monday – Friday, 9:00am – 5:00pm”Contact page detail blockspage-contact.hbs
“Send a Message” and the form field labelsContact page formpage-contact.hbs
“Contributors” / “All Topics”Directory page headingspage-authors.hbs / page-tags.hbs
Fallback homepage descriptionHero masthead, when no site description is setthe three hero-*.hbs partials
Copyright line and “Published with Ghost”Footer bottom barpartials/components/footer.hbs

Set your site description

The hero masthead falls back to a line about “pediatric wellness, education practices, and family growth” when your publication has no description. Set one under Settings → General → Publication info — one sentence — and your own words appear instead, with no template editing.

Edit both copies

Where a row above names two files, they are the duplicate page/route templates described in Theme File Structure. Change both so the page looks the same however it is reached.

Troubleshooting

The top of my homepage is empty — just the site title

No posts are marked as Featured. Every hero layout is built from featured posts. Open a post, go to the settings panel, and switch on Feature this post. Three to five featured posts gives the intended result.

The hero slider does not slide

The Swiper library is loaded from a CDN and could not be reached — a network block, an offline environment, or a script blocker. Check the browser console for a failed request to cdn.jsdelivr.net. The slides stack vertically as a fallback, so nothing is lost. To remove the dependency, choose the Premium Grid hero, or download Swiper into assets/ and update the tags in default.hbs.

The footer columns are empty, or show a reminder message

Footer columns come from Settings → Navigation → Secondary navigation, and each column is started by a link whose URL is exactly ##. Check that your first secondary item is such a heading — links added before the first ## have no column to go into. Remember the maximum is three columns.

My header drop-down menus do not open

Kidoo's header menu is a single flat row of links; it has no drop-down submenus, and hyphen-prefixed labels are not treated as child items. Use the footer's three link columns for extra destinations, or switch Header style to Minimal Navigation so every link gets its own row in the drawer.

The FAQ section is missing from my membership page

Check three things: a page exists with the URL slug exactly membership-faq; it is published, not draft; and it contains at least one Toggle card with content. Ghost silently appends a number to a duplicate slug, so reopen the page settings and confirm the URL still reads membership-faq.

My membership page shows no pricing cards

The cards are built from your Ghost tiers. Go to Settings → Tiers and confirm at least one tier exists and its visibility is Public. Paid tiers additionally need Stripe connected under Settings → Membership before they can be purchased.

My contact page is blank between the header and footer

The /contact/ entry in the shipped routes.yaml has no page binding, so the contact template receives no page to render. Change that route to include data: page.contact and re-upload — the full corrected file is in Special Pages & Routing. The give-away is that /membership/, /tags/ and /authors/ all work, because they already carry their bindings.

/signin/ or /signup/ shows a 404 or the wrong layout

These two paths only work once routes.yaml is uploaded — see Special Pages & Routing. Without it, use Ghost Portal's built-in overlays instead; the header links open them.

A page URL 404s after uploading routes.yaml

The routes for /membership/, /contact/, /authors/ and /tags/ are bound to a Ghost page, so each needs a published page with that exact slug. Create any that are missing, and check the slug in the page settings panel — Ghost appends a number if the slug is already in use.

Tag images are showing when I do not want them (or vice versa)

Toggle Show tag featured image under Design and branding → Custom. It controls the homepage Popular Topics cards, the All Topics directory and the tag archive header together — there is no per-place control.

The contact form does not send anything

It is a mailto: form: it opens the visitor's own email application rather than sending from your server, and does nothing on a device with no mail app configured. Swap in an embedded third-party form if you need reliable delivery — see Contact Page.

Nothing changes when I edit a theme setting

Theme settings apply immediately, so this is nearly always caching. Hard-refresh (Cmd/Ctrl + Shift + R), and if you use Cloudflare or another CDN, purge its cache. Also confirm Kidoo is the active theme — settings from an uploaded-but-inactive theme have no effect.

My logo is invisible in the header

The header background is dark in both light and dark mode. Upload a light or white version of your logo, ideally a transparent PNG or SVG. It is rendered at 24px tall.

Ghost rejects the theme on upload

Upload the inner kidoo.zip, not the outer download package and not a re-zipped folder. package.json must sit at the very top level of the zip. Confirm too that your Ghost version is 5.0 or newer.

Dark mode looks wrong on my own images

Transparent images with dark artwork disappear against dark surfaces. Re-export affected logos and diagrams with a background, or in a light colourway.

Support & Licence

Thank you for choosing Kidoo. If something is not behaving as this guide describes, we are glad to help.

Before getting in touch

These details let us give you a useful answer straight away:

  • Your site URL, and the page where you see the problem.
  • Your Ghost version — Settings → Advanced → About Ghost — and whether you are on Ghost(Pro) or self-hosted.
  • The theme version, from package.json.
  • What you expected, what happened instead, and a screenshot.
  • Any changes you have made to the theme files or code injection.

What support covers

Included

The theme as documented

Installation help, bug fixes, clarifying anything in this guide, and compatibility fixes for new Ghost releases.

Not included

Custom development

Custom features, design changes, third-party integrations, Ghost hosting and server administration, and content or SEO work. We are happy to quote separately for custom work.

Ghost itself

Questions about Ghost rather than the theme — hosting, Stripe payouts, email delivery, member billing — are answered fastest by Ghost's own documentation at ghost.org/docs and the Ghost forum. Ghost(Pro) customers also have support directly from Ghost.

Licence

Kidoo is released under the MIT licence, and its use is governed by the terms of the marketplace you purchased it through. In short: one licence covers one production site, you may modify the theme freely for your own use, and you may not redistribute or resell it as your own product. Buy an additional licence for each additional site.

Kidoo v1.0.0 · Documentation last updated 13 August 2026 · Built for Ghost 5.x and 6.x.