v0.1.4 개발 실행 별칭 및 샘플 콘텐츠 추가
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
||||
.DS_Store
|
||||
.cursor/
|
||||
.vscode/
|
||||
package-lock.json
|
||||
AGENTS.md
|
||||
docs/
|
||||
theme-export/
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
143
scripts/build-sample-content.js
Normal file
143
scripts/build-sample-content.js
Normal file
@@ -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}`);
|
||||
@@ -14,6 +14,7 @@ rsync -a --delete \
|
||||
--exclude='.docker/' \
|
||||
--exclude='docs/' \
|
||||
--exclude='local-ghost/' \
|
||||
--exclude='seed/' \
|
||||
--exclude='theme-export/' \
|
||||
--exclude='scripts/' \
|
||||
--exclude='*.zip' \
|
||||
|
||||
15
seed/README.md
Normal file
15
seed/README.md
Normal file
@@ -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
|
||||
552
seed/thred-inspired-sample-content.ghost.json
Normal file
552
seed/thred-inspired-sample-content.ghost.json
Normal file
@@ -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": []
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user