diff --git a/.gitignore b/.gitignore index 039bee1..82c337b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .DS_Store .cursor/ .vscode/ +package-lock.json AGENTS.md docs/ theme-export/ diff --git a/README.md b/README.md index fc7774c..28cc3e1 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ This repository contains a Ghost theme scaffold inspired by the `Thred` referenc 2. Open `http://localhost:2368/ghost` and complete the local Ghost setup 3. Activate the `ghost-theme-thred-clone` theme in `Settings -> Design` 4. After theme changes, run `npm run dev:ghost:restart` +5. To add local sample categories and posts, run `npm run dev:seed` and import the generated JSON file from Ghost Admin The local Docker setup syncs only theme-related files into `.docker/theme/ghost-theme-thred-clone`, so work files such as `docs/` or `local-ghost/` do not slow down Ghost startup. diff --git a/package.json b/package.json index f7b9183..4b5360b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghost-theme-thred-clone", - "version": "0.1.3", + "version": "0.1.4", "private": true, "description": "A Ghost theme inspired by the Thred reference layout.", "author": { @@ -68,7 +68,10 @@ } }, "scripts": { + "dev": "npm run dev:ghost:start", "dev:sync": "sh ./scripts/sync-theme.sh", + "dev:seed": "node ./scripts/build-sample-content.js", + "dev:seed:zip": "npm run dev:seed && cd seed && zip -q -r thred-inspired-sample-content.ghost.zip thred-inspired-sample-content.ghost.json", "dev:ghost:start": "npm run dev:sync && docker compose up -d", "dev:ghost:restart": "npm run dev:sync && docker compose restart ghost", "dev:ghost:stop": "docker compose down", diff --git a/scripts/build-sample-content.js b/scripts/build-sample-content.js new file mode 100644 index 0000000..d4c429e --- /dev/null +++ b/scripts/build-sample-content.js @@ -0,0 +1,143 @@ +const fs = require('fs'); +const path = require('path'); + +const outputDir = path.join(__dirname, '..', 'seed'); +const outputFile = path.join(outputDir, 'thred-inspired-sample-content.ghost.json'); + +const tags = [ + {id: 'tag-books', name: 'Books', slug: 'books'}, + {id: 'tag-business', name: 'Business', slug: 'business'}, + {id: 'tag-tech', name: 'Tech', slug: 'tech'}, + {id: 'tag-science', name: 'Science', slug: 'science'}, + {id: 'tag-design', name: 'Design', slug: 'design'}, + {id: 'tag-music', name: 'Music', slug: 'music'}, + {id: 'tag-health', name: 'Health', slug: 'health'}, + {id: 'tag-gaming', name: 'Gaming', slug: 'gaming'}, + {id: 'tag-travel', name: 'Travel', slug: 'travel'}, + {id: 'tag-diy', name: 'DIY', slug: 'diy'} +]; + +const postBlueprints = [ + ['books', 'Independent bookstores worth planning a full afternoon around', 'A short guide to cozy stores, smart curation, and how to browse without rushing the experience.'], + ['books', 'How to build a reading routine when your schedule is a mess', 'Simple habits for reading more consistently without turning books into another productivity task.'], + ['business', 'Pricing freelance design work without undercutting your future self', 'A practical framework for deciding rates, packaging work, and handling client expectations early.'], + ['business', 'What small teams should document before they scale too fast', 'The lightweight systems that reduce chaos before hiring and handoff complexity grow.'], + ['tech', 'Setting up your first home server without making it too complicated', 'A beginner-friendly overview of hardware choices, storage planning, and sensible first services.'], + ['tech', 'AI tools that feel genuinely useful in a daily workflow', 'A grounded look at where automation helps, where it interrupts, and how to evaluate tradeoffs.'], + ['science', 'Climate reporting habits that make difficult research easier to follow', 'How to read scientific updates with context, avoid hype, and keep track of what changed.'], + ['science', 'What makes a good science explainer feel trustworthy', 'Clarity, framing, and citation habits that help complex ideas stay readable without becoming shallow.'], + ['design', 'Portfolio case studies that show thinking instead of decoration', 'How to structure project stories so decisions, constraints, and outcomes are easy to understand.'], + ['design', 'Why some interfaces feel calm even when they are information dense', 'Spacing, hierarchy, rhythm, and restraint working together to reduce visual stress.'], + ['music', 'Starter listening setups that make home music sessions more enjoyable', 'A realistic guide to headphones, speakers, and desk setups for focused everyday listening.'], + ['music', 'Beginner friendly ways to organize samples before a project gets messy', 'Folder structures, naming patterns, and curation habits that save time later.'], + ['health', 'Morning routines that support energy without pretending every day is perfect', 'Flexible routines for sleep, movement, hydration, and focus that can survive real schedules.'], + ['health', 'Meal prep ideas for people who get bored of repeating the same lunch', 'Modular ingredients and simple flavor changes that keep weekday meals easier to sustain.'], + ['gaming', 'Games that are easy to recommend when friends like different genres', 'A list of accessible picks that still feel distinct in pacing, tone, and challenge.'], + ['gaming', 'What actually matters most in a first gaming PC build', 'The parts worth prioritizing, where to save money, and how to avoid lopsided builds.'], + ['travel', 'A slower approach to city travel for people who hate checklist tourism', 'How to shape a trip around neighborhoods, cafés, bookstores, and repeated visits instead of rushing.'], + ['travel', 'Packing for a week with one bag without feeling underprepared', 'A calm, repeatable packing system focused on layering, daily use, and fewer just-in-case items.'], + ['diy', 'Home workshop basics for makers who only have a small corner to work in', 'The compact tools and storage habits that make limited spaces feel surprisingly capable.'], + ['diy', 'Simple repair projects that build confidence before bigger DIY upgrades', 'Low-risk weekend fixes that teach useful fundamentals without requiring specialist equipment.'] +]; + +const featureImages = { + books: 'https://images.unsplash.com/photo-1521587760476-6c12a4b040da?auto=format&fit=crop&w=1200&q=80', + business: 'https://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&fit=crop&w=1200&q=80', + tech: 'https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1200&q=80', + science: 'https://images.unsplash.com/photo-1532187863486-abf9dbad1b69?auto=format&fit=crop&w=1200&q=80', + design: 'https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=1200&q=80', + music: 'https://images.unsplash.com/photo-1511379938547-c1f69419868d?auto=format&fit=crop&w=1200&q=80', + health: 'https://images.unsplash.com/photo-1517836357463-d25dfeac3438?auto=format&fit=crop&w=1200&q=80', + gaming: 'https://images.unsplash.com/photo-1542751371-adc38448a05e?auto=format&fit=crop&w=1200&q=80', + travel: 'https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1200&q=80', + diy: 'https://images.unsplash.com/photo-1504148455328-c376907d081c?auto=format&fit=crop&w=1200&q=80' +}; + +function toMobiledoc(paragraphs) { + return JSON.stringify({ + version: '0.3.1', + atoms: [], + cards: [], + markups: [], + sections: paragraphs.map((text) => [1, 'p', [[0, [], 0, text]]]) + }); +} + +function toSlug(text) { + return text + .toLowerCase() + .replace(/[^a-z0-9\s-]/g, '') + .trim() + .replace(/\s+/g, '-'); +} + +function dateString(offsetDays) { + const date = new Date(Date.UTC(2026, 1, 1, 3, 0, 0)); + date.setUTCDate(date.getUTCDate() - offsetDays); + return date.toISOString().slice(0, 19).replace('T', ' '); +} + +const posts = []; +const postsMeta = []; +const postsTags = []; + +postBlueprints.forEach(([tagSlug, title, excerpt], index) => { + const postId = `post-${index + 1}`; + const tag = tags.find((item) => item.slug === tagSlug); + const body = [ + excerpt, + 'This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.', + 'Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.' + ]; + + posts.push({ + id: postId, + title, + slug: toSlug(title), + status: 'published', + visibility: 'public', + type: 'post', + featured: index % 5 === 0, + custom_excerpt: excerpt, + feature_image: featureImages[tagSlug], + mobiledoc: toMobiledoc(body), + created_at: dateString(index + 3), + updated_at: dateString(index + 2), + published_at: dateString(index + 3) + }); + + postsMeta.push({ + post_id: postId, + feature_image_alt: `${tag.name} sample article cover image`, + feature_image_caption: `${tag.name} category sample content` + }); + + postsTags.push({ + post_id: postId, + tag_id: tag.id + }); +}); + +const payload = { + db: [ + { + meta: { + exported_on: Date.now(), + version: '6.28.0' + }, + data: { + posts, + posts_meta: postsMeta, + tags, + posts_tags: postsTags, + users: [], + posts_authors: [] + } + } + ] +}; + +fs.mkdirSync(outputDir, {recursive: true}); +fs.writeFileSync(outputFile, JSON.stringify(payload, null, 2)); + +console.log(`Sample Ghost import written to ${outputFile}`); diff --git a/scripts/sync-theme.sh b/scripts/sync-theme.sh index beb0b32..90c89ff 100755 --- a/scripts/sync-theme.sh +++ b/scripts/sync-theme.sh @@ -14,6 +14,7 @@ rsync -a --delete \ --exclude='.docker/' \ --exclude='docs/' \ --exclude='local-ghost/' \ + --exclude='seed/' \ --exclude='theme-export/' \ --exclude='scripts/' \ --exclude='*.zip' \ diff --git a/seed/README.md b/seed/README.md new file mode 100644 index 0000000..f44073f --- /dev/null +++ b/seed/README.md @@ -0,0 +1,15 @@ +# Sample Content + +Run `npm run dev:seed` to regenerate the local Ghost import file. + +Then import `seed/thred-inspired-sample-content.ghost.json` from Ghost Admin: + +1. Open `http://localhost:2368/ghost` +2. Go to `Settings -> Advanced -> Import/Export` +3. Use the Universal import option + +This sample file contains: + +- 10 category-like tags +- 20 published posts +- realistic excerpts and body copy for layout testing diff --git a/seed/thred-inspired-sample-content.ghost.json b/seed/thred-inspired-sample-content.ghost.json new file mode 100644 index 0000000..4a1a0fe --- /dev/null +++ b/seed/thred-inspired-sample-content.ghost.json @@ -0,0 +1,552 @@ +{ + "db": [ + { + "meta": { + "exported_on": 1776048101286, + "version": "6.28.0" + }, + "data": { + "posts": [ + { + "id": "post-1", + "title": "Independent bookstores worth planning a full afternoon around", + "slug": "independent-bookstores-worth-planning-a-full-afternoon-around", + "status": "published", + "visibility": "public", + "type": "post", + "featured": true, + "custom_excerpt": "A short guide to cozy stores, smart curation, and how to browse without rushing the experience.", + "feature_image": "https://images.unsplash.com/photo-1521587760476-6c12a4b040da?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A short guide to cozy stores, smart curation, and how to browse without rushing the experience.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-29 03:00:00", + "updated_at": "2026-01-30 03:00:00", + "published_at": "2026-01-29 03:00:00" + }, + { + "id": "post-2", + "title": "How to build a reading routine when your schedule is a mess", + "slug": "how-to-build-a-reading-routine-when-your-schedule-is-a-mess", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Simple habits for reading more consistently without turning books into another productivity task.", + "feature_image": "https://images.unsplash.com/photo-1521587760476-6c12a4b040da?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Simple habits for reading more consistently without turning books into another productivity task.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-28 03:00:00", + "updated_at": "2026-01-29 03:00:00", + "published_at": "2026-01-28 03:00:00" + }, + { + "id": "post-3", + "title": "Pricing freelance design work without undercutting your future self", + "slug": "pricing-freelance-design-work-without-undercutting-your-future-self", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "A practical framework for deciding rates, packaging work, and handling client expectations early.", + "feature_image": "https://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A practical framework for deciding rates, packaging work, and handling client expectations early.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-27 03:00:00", + "updated_at": "2026-01-28 03:00:00", + "published_at": "2026-01-27 03:00:00" + }, + { + "id": "post-4", + "title": "What small teams should document before they scale too fast", + "slug": "what-small-teams-should-document-before-they-scale-too-fast", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "The lightweight systems that reduce chaos before hiring and handoff complexity grow.", + "feature_image": "https://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"The lightweight systems that reduce chaos before hiring and handoff complexity grow.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-26 03:00:00", + "updated_at": "2026-01-27 03:00:00", + "published_at": "2026-01-26 03:00:00" + }, + { + "id": "post-5", + "title": "Setting up your first home server without making it too complicated", + "slug": "setting-up-your-first-home-server-without-making-it-too-complicated", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "A beginner-friendly overview of hardware choices, storage planning, and sensible first services.", + "feature_image": "https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A beginner-friendly overview of hardware choices, storage planning, and sensible first services.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-25 03:00:00", + "updated_at": "2026-01-26 03:00:00", + "published_at": "2026-01-25 03:00:00" + }, + { + "id": "post-6", + "title": "AI tools that feel genuinely useful in a daily workflow", + "slug": "ai-tools-that-feel-genuinely-useful-in-a-daily-workflow", + "status": "published", + "visibility": "public", + "type": "post", + "featured": true, + "custom_excerpt": "A grounded look at where automation helps, where it interrupts, and how to evaluate tradeoffs.", + "feature_image": "https://images.unsplash.com/photo-1518770660439-4636190af475?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A grounded look at where automation helps, where it interrupts, and how to evaluate tradeoffs.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-24 03:00:00", + "updated_at": "2026-01-25 03:00:00", + "published_at": "2026-01-24 03:00:00" + }, + { + "id": "post-7", + "title": "Climate reporting habits that make difficult research easier to follow", + "slug": "climate-reporting-habits-that-make-difficult-research-easier-to-follow", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "How to read scientific updates with context, avoid hype, and keep track of what changed.", + "feature_image": "https://images.unsplash.com/photo-1532187863486-abf9dbad1b69?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"How to read scientific updates with context, avoid hype, and keep track of what changed.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-23 03:00:00", + "updated_at": "2026-01-24 03:00:00", + "published_at": "2026-01-23 03:00:00" + }, + { + "id": "post-8", + "title": "What makes a good science explainer feel trustworthy", + "slug": "what-makes-a-good-science-explainer-feel-trustworthy", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Clarity, framing, and citation habits that help complex ideas stay readable without becoming shallow.", + "feature_image": "https://images.unsplash.com/photo-1532187863486-abf9dbad1b69?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Clarity, framing, and citation habits that help complex ideas stay readable without becoming shallow.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-22 03:00:00", + "updated_at": "2026-01-23 03:00:00", + "published_at": "2026-01-22 03:00:00" + }, + { + "id": "post-9", + "title": "Portfolio case studies that show thinking instead of decoration", + "slug": "portfolio-case-studies-that-show-thinking-instead-of-decoration", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "How to structure project stories so decisions, constraints, and outcomes are easy to understand.", + "feature_image": "https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"How to structure project stories so decisions, constraints, and outcomes are easy to understand.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-21 03:00:00", + "updated_at": "2026-01-22 03:00:00", + "published_at": "2026-01-21 03:00:00" + }, + { + "id": "post-10", + "title": "Why some interfaces feel calm even when they are information dense", + "slug": "why-some-interfaces-feel-calm-even-when-they-are-information-dense", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Spacing, hierarchy, rhythm, and restraint working together to reduce visual stress.", + "feature_image": "https://images.unsplash.com/photo-1498050108023-c5249f4df085?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Spacing, hierarchy, rhythm, and restraint working together to reduce visual stress.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-20 03:00:00", + "updated_at": "2026-01-21 03:00:00", + "published_at": "2026-01-20 03:00:00" + }, + { + "id": "post-11", + "title": "Starter listening setups that make home music sessions more enjoyable", + "slug": "starter-listening-setups-that-make-home-music-sessions-more-enjoyable", + "status": "published", + "visibility": "public", + "type": "post", + "featured": true, + "custom_excerpt": "A realistic guide to headphones, speakers, and desk setups for focused everyday listening.", + "feature_image": "https://images.unsplash.com/photo-1511379938547-c1f69419868d?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A realistic guide to headphones, speakers, and desk setups for focused everyday listening.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-19 03:00:00", + "updated_at": "2026-01-20 03:00:00", + "published_at": "2026-01-19 03:00:00" + }, + { + "id": "post-12", + "title": "Beginner friendly ways to organize samples before a project gets messy", + "slug": "beginner-friendly-ways-to-organize-samples-before-a-project-gets-messy", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Folder structures, naming patterns, and curation habits that save time later.", + "feature_image": "https://images.unsplash.com/photo-1511379938547-c1f69419868d?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Folder structures, naming patterns, and curation habits that save time later.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-18 03:00:00", + "updated_at": "2026-01-19 03:00:00", + "published_at": "2026-01-18 03:00:00" + }, + { + "id": "post-13", + "title": "Morning routines that support energy without pretending every day is perfect", + "slug": "morning-routines-that-support-energy-without-pretending-every-day-is-perfect", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Flexible routines for sleep, movement, hydration, and focus that can survive real schedules.", + "feature_image": "https://images.unsplash.com/photo-1517836357463-d25dfeac3438?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Flexible routines for sleep, movement, hydration, and focus that can survive real schedules.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-17 03:00:00", + "updated_at": "2026-01-18 03:00:00", + "published_at": "2026-01-17 03:00:00" + }, + { + "id": "post-14", + "title": "Meal prep ideas for people who get bored of repeating the same lunch", + "slug": "meal-prep-ideas-for-people-who-get-bored-of-repeating-the-same-lunch", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Modular ingredients and simple flavor changes that keep weekday meals easier to sustain.", + "feature_image": "https://images.unsplash.com/photo-1517836357463-d25dfeac3438?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Modular ingredients and simple flavor changes that keep weekday meals easier to sustain.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-16 03:00:00", + "updated_at": "2026-01-17 03:00:00", + "published_at": "2026-01-16 03:00:00" + }, + { + "id": "post-15", + "title": "Games that are easy to recommend when friends like different genres", + "slug": "games-that-are-easy-to-recommend-when-friends-like-different-genres", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "A list of accessible picks that still feel distinct in pacing, tone, and challenge.", + "feature_image": "https://images.unsplash.com/photo-1542751371-adc38448a05e?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A list of accessible picks that still feel distinct in pacing, tone, and challenge.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-15 03:00:00", + "updated_at": "2026-01-16 03:00:00", + "published_at": "2026-01-15 03:00:00" + }, + { + "id": "post-16", + "title": "What actually matters most in a first gaming PC build", + "slug": "what-actually-matters-most-in-a-first-gaming-pc-build", + "status": "published", + "visibility": "public", + "type": "post", + "featured": true, + "custom_excerpt": "The parts worth prioritizing, where to save money, and how to avoid lopsided builds.", + "feature_image": "https://images.unsplash.com/photo-1542751371-adc38448a05e?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"The parts worth prioritizing, where to save money, and how to avoid lopsided builds.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-14 03:00:00", + "updated_at": "2026-01-15 03:00:00", + "published_at": "2026-01-14 03:00:00" + }, + { + "id": "post-17", + "title": "A slower approach to city travel for people who hate checklist tourism", + "slug": "a-slower-approach-to-city-travel-for-people-who-hate-checklist-tourism", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "How to shape a trip around neighborhoods, cafés, bookstores, and repeated visits instead of rushing.", + "feature_image": "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"How to shape a trip around neighborhoods, cafés, bookstores, and repeated visits instead of rushing.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-13 03:00:00", + "updated_at": "2026-01-14 03:00:00", + "published_at": "2026-01-13 03:00:00" + }, + { + "id": "post-18", + "title": "Packing for a week with one bag without feeling underprepared", + "slug": "packing-for-a-week-with-one-bag-without-feeling-underprepared", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "A calm, repeatable packing system focused on layering, daily use, and fewer just-in-case items.", + "feature_image": "https://images.unsplash.com/photo-1500530855697-b586d89ba3ee?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"A calm, repeatable packing system focused on layering, daily use, and fewer just-in-case items.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-12 03:00:00", + "updated_at": "2026-01-13 03:00:00", + "published_at": "2026-01-12 03:00:00" + }, + { + "id": "post-19", + "title": "Home workshop basics for makers who only have a small corner to work in", + "slug": "home-workshop-basics-for-makers-who-only-have-a-small-corner-to-work-in", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "The compact tools and storage habits that make limited spaces feel surprisingly capable.", + "feature_image": "https://images.unsplash.com/photo-1504148455328-c376907d081c?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"The compact tools and storage habits that make limited spaces feel surprisingly capable.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-11 03:00:00", + "updated_at": "2026-01-12 03:00:00", + "published_at": "2026-01-11 03:00:00" + }, + { + "id": "post-20", + "title": "Simple repair projects that build confidence before bigger DIY upgrades", + "slug": "simple-repair-projects-that-build-confidence-before-bigger-diy-upgrades", + "status": "published", + "visibility": "public", + "type": "post", + "featured": false, + "custom_excerpt": "Low-risk weekend fixes that teach useful fundamentals without requiring specialist equipment.", + "feature_image": "https://images.unsplash.com/photo-1504148455328-c376907d081c?auto=format&fit=crop&w=1200&q=80", + "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Low-risk weekend fixes that teach useful fundamentals without requiring specialist equipment.\"]]],[1,\"p\",[[0,[],0,\"This sample post exists to help preview archive lists, tag pages, and reading layouts while the theme is being refined.\"]]],[1,\"p\",[[0,[],0,\"Once the structure and styling feel right, these placeholders can be replaced with real editorial content inside Ghost Admin.\"]]]]}", + "created_at": "2026-01-10 03:00:00", + "updated_at": "2026-01-11 03:00:00", + "published_at": "2026-01-10 03:00:00" + } + ], + "posts_meta": [ + { + "post_id": "post-1", + "feature_image_alt": "Books sample article cover image", + "feature_image_caption": "Books category sample content" + }, + { + "post_id": "post-2", + "feature_image_alt": "Books sample article cover image", + "feature_image_caption": "Books category sample content" + }, + { + "post_id": "post-3", + "feature_image_alt": "Business sample article cover image", + "feature_image_caption": "Business category sample content" + }, + { + "post_id": "post-4", + "feature_image_alt": "Business sample article cover image", + "feature_image_caption": "Business category sample content" + }, + { + "post_id": "post-5", + "feature_image_alt": "Tech sample article cover image", + "feature_image_caption": "Tech category sample content" + }, + { + "post_id": "post-6", + "feature_image_alt": "Tech sample article cover image", + "feature_image_caption": "Tech category sample content" + }, + { + "post_id": "post-7", + "feature_image_alt": "Science sample article cover image", + "feature_image_caption": "Science category sample content" + }, + { + "post_id": "post-8", + "feature_image_alt": "Science sample article cover image", + "feature_image_caption": "Science category sample content" + }, + { + "post_id": "post-9", + "feature_image_alt": "Design sample article cover image", + "feature_image_caption": "Design category sample content" + }, + { + "post_id": "post-10", + "feature_image_alt": "Design sample article cover image", + "feature_image_caption": "Design category sample content" + }, + { + "post_id": "post-11", + "feature_image_alt": "Music sample article cover image", + "feature_image_caption": "Music category sample content" + }, + { + "post_id": "post-12", + "feature_image_alt": "Music sample article cover image", + "feature_image_caption": "Music category sample content" + }, + { + "post_id": "post-13", + "feature_image_alt": "Health sample article cover image", + "feature_image_caption": "Health category sample content" + }, + { + "post_id": "post-14", + "feature_image_alt": "Health sample article cover image", + "feature_image_caption": "Health category sample content" + }, + { + "post_id": "post-15", + "feature_image_alt": "Gaming sample article cover image", + "feature_image_caption": "Gaming category sample content" + }, + { + "post_id": "post-16", + "feature_image_alt": "Gaming sample article cover image", + "feature_image_caption": "Gaming category sample content" + }, + { + "post_id": "post-17", + "feature_image_alt": "Travel sample article cover image", + "feature_image_caption": "Travel category sample content" + }, + { + "post_id": "post-18", + "feature_image_alt": "Travel sample article cover image", + "feature_image_caption": "Travel category sample content" + }, + { + "post_id": "post-19", + "feature_image_alt": "DIY sample article cover image", + "feature_image_caption": "DIY category sample content" + }, + { + "post_id": "post-20", + "feature_image_alt": "DIY sample article cover image", + "feature_image_caption": "DIY category sample content" + } + ], + "tags": [ + { + "id": "tag-books", + "name": "Books", + "slug": "books" + }, + { + "id": "tag-business", + "name": "Business", + "slug": "business" + }, + { + "id": "tag-tech", + "name": "Tech", + "slug": "tech" + }, + { + "id": "tag-science", + "name": "Science", + "slug": "science" + }, + { + "id": "tag-design", + "name": "Design", + "slug": "design" + }, + { + "id": "tag-music", + "name": "Music", + "slug": "music" + }, + { + "id": "tag-health", + "name": "Health", + "slug": "health" + }, + { + "id": "tag-gaming", + "name": "Gaming", + "slug": "gaming" + }, + { + "id": "tag-travel", + "name": "Travel", + "slug": "travel" + }, + { + "id": "tag-diy", + "name": "DIY", + "slug": "diy" + } + ], + "posts_tags": [ + { + "post_id": "post-1", + "tag_id": "tag-books" + }, + { + "post_id": "post-2", + "tag_id": "tag-books" + }, + { + "post_id": "post-3", + "tag_id": "tag-business" + }, + { + "post_id": "post-4", + "tag_id": "tag-business" + }, + { + "post_id": "post-5", + "tag_id": "tag-tech" + }, + { + "post_id": "post-6", + "tag_id": "tag-tech" + }, + { + "post_id": "post-7", + "tag_id": "tag-science" + }, + { + "post_id": "post-8", + "tag_id": "tag-science" + }, + { + "post_id": "post-9", + "tag_id": "tag-design" + }, + { + "post_id": "post-10", + "tag_id": "tag-design" + }, + { + "post_id": "post-11", + "tag_id": "tag-music" + }, + { + "post_id": "post-12", + "tag_id": "tag-music" + }, + { + "post_id": "post-13", + "tag_id": "tag-health" + }, + { + "post_id": "post-14", + "tag_id": "tag-health" + }, + { + "post_id": "post-15", + "tag_id": "tag-gaming" + }, + { + "post_id": "post-16", + "tag_id": "tag-gaming" + }, + { + "post_id": "post-17", + "tag_id": "tag-travel" + }, + { + "post_id": "post-18", + "tag_id": "tag-travel" + }, + { + "post_id": "post-19", + "tag_id": "tag-diy" + }, + { + "post_id": "post-20", + "tag_id": "tag-diy" + } + ], + "users": [], + "posts_authors": [] + } + } + ] +} \ No newline at end of file