diff --git a/core/server/data/schema/fixtures/fixtures.json b/core/server/data/schema/fixtures/fixtures.json
index b19dd1f537..b2af603f08 100644
--- a/core/server/data/schema/fixtures/fixtures.json
+++ b/core/server/data/schema/fixtures/fixtures.json
@@ -476,7 +476,7 @@
"location": "The Internet",
"website": "https://ghost.org",
"bio": "You can delete this user to remove all the welcome posts",
- "profile_image": "https://static.ghost.org/v3.0.0/images/ghost.png"
+ "profile_image": "https://static.ghost.org/v4.0.0/images/ghost-user.png"
}
]
},
@@ -484,109 +484,155 @@
"name": "Post",
"entries": [
{
- "title": "Creating a custom theme",
- "slug": "themes",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v3.0.0/images/theme-marketplace.png\",\"caption\":\"Anyone can write a completely custom Ghost theme with some solid knowledge of HTML and CSS\",\"alt\":\"Ghost theme marketplace screenshot\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/marketplace/\"]],[\"code\"],[\"a\",[\"href\",\"https://github.com/TryGhost/Casper\"]],[\"a\",[\"href\",\"https://ghost.org/docs/themes/\"]],[\"a\",[\"href\",\"https://github.com/TryGhost/Starter/\"]],[\"strong\"],[\"a\",[\"href\",\"https://forum.ghost.org/c/themes\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Ghost themes\"]]],[1,\"p\",[[0,[],0,\"Ghost comes with a default theme called Casper, which is designed to be a clean, readable publication layout and can be easily adapted for most purposes.\"]]],[1,\"p\",[[0,[],0,\"If you need something a little more customised, it's entirely possible to build on top of existing open source themes, or to build your own from scratch. Rather than giving you a few basic settings which act as a poor proxy for code, we just let you write code.\"]]],[1,\"h2\",[[0,[],0,\"Marketplace\"]]],[1,\"p\",[[0,[],0,\"There are a huge range of both free and premium pre-built themes which you can download from the \"],[0,[0],1,\"Ghost Theme Marketplace\"],[0,[],0,\":\"]]],[10,0],[1,\"h2\",[[0,[],0,\"Theme development\"]]],[1,\"p\",[[0,[],0,\"Ghost themes are written with a templating language called handlebars, which has a set of dynamic helpers to insert your data into template files. For example: \"],[0,[1],1,\"{{author.name}}\"],[0,[],0,\" outputs the name of the current author.\"]]],[1,\"p\",[[0,[],0,\"The best way to learn how to write your own Ghost theme is to have a look at \"],[0,[2],1,\"the source code for Casper\"],[0,[],0,\", which is heavily commented and should give you a sense of how everything fits together.\"],[1,[],0,0]]],[3,\"ul\",[[[0,[1],1,\"default.hbs\"],[0,[],0,\" is the main template file, all contexts will load inside this file unless specifically told to use a different template.\"]],[[0,[1],1,\"post.hbs\"],[0,[],0,\" is the file used in the context of viewing a post.\"]],[[0,[1],1,\"index.hbs\"],[0,[],0,\" is the file used in the context of viewing the home page.\"]],[[0,[],0,\"and so on\"]]]],[1,\"p\",[[0,[],0,\"We've got \"],[0,[3],1,\"full and extensive theme documentation\"],[0,[],0,\" which outlines every template file, context and helper that you can use. You can also get started with our useful \"],[0,[4],1,\"starter theme\"],[0,[],0,\", which includes the most common foundations and components required to build your own theme.\"]]],[1,\"blockquote\",[[0,[],0,\"If you want to chat with other people making Ghost themes to get any advice or help, there's also a \"],[0,[5],1,\"themes\"],[0,[],0,\" section on our \"],[0,[6],1,\"public Ghost forum\"],[0,[],0,\".\"]]]]}",
+ "title": "Setting up apps and custom integrations",
+ "slug": "integrations",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/integrations-icons.png\",\"cardWidth\":\"full\"}],[\"markdown\",{\"markdown\":\"\\n\"}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/iawriter-integration.png\",\"width\":2244,\"height\":936}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/integrations/\"]],[\"strong\"]],\"sections\":[[1,\"p\",[[0,[],0,\"It's possible to extend your Ghost site and connect it with hundreds of the most popular apps and tools using integrations. \"]]],[1,\"p\",[[0,[],0,\"Whether you need to automatically publish new posts on social media, connect your favorite analytics tool, sync your community or embed forms into your content — our \"],[0,[0],1,\"integrations library\"],[0,[],0,\" has got it all covered with hundreds of integration tutorials.\"]]],[1,\"p\",[[0,[],0,\"Many integrations are as simple as inserting an embed by pasting a link, or copying a snippet of code directly from an app and pasting it into Ghost. Our integration tutorials are used by creators of all kinds to get apps and integrations up and running in no time — no technical knowledge required.\"]]],[10,0],[1,\"h2\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"Zapier is a no-code tool that allows you to build powerful automations, and our official integration allows you to connect your Ghost site to more than 1,000 external services.\"]]],[1,\"blockquote\",[[0,[1],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[1],1,\"Here's a few of the most popular automation templates:\"],[0,[],0,\" \"]]],[10,1],[1,\"h2\",[[0,[],0,\"Custom integrations\"]]],[1,\"p\",[[0,[],0,\"For more advanced automation, it's possible to create custom Ghost integrations with dedicated API keys from the Integrations page within Ghost Admin. \"]]],[10,2],[1,\"p\",[[0,[],0,\"These custom integrations allow you to use the Ghost API without needing to write code, and create powerful workflows such as sending content from your favorite desktop editor into Ghost as a new draft.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/app-integrations.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "Work with all your favorite apps and tools or create your own custom integrations using the Ghost API.",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "Ghost comes with a beautiful default theme designed for publishers which can easily be adapted for most purposes, or you can build a custom theme to suit your needs.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/creating-a-custom-theme.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
{
- "title": "Apps & integrations",
- "slug": "apps-integrations",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v3.0.0/images/integrations-icons.png\",\"cardWidth\":\"full\"}],[\"markdown\",{\"markdown\":\"\\n\"}],[\"image\",{\"src\":\"https://static.ghost.org/v3.0.0/images/integrations-and-webhooks-in-ghost.png\",\"alt\":\"Screenshot of custom integrations with webhooks in Ghost Admin\",\"cardWidth\":\"\"}]],\"markups\":[[\"a\",[\"href\",\"https://ghost.org/integrations/\"]],[\"a\",[\"href\",\"https://zapier.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/docs/content-api/\"]],[\"a\",[\"href\",\"/themes/\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Work with your existing tools\"]]],[1,\"p\",[[0,[],0,\"It's possible to connect your Ghost site to hundreds of the most popular apps and tools using integrations that take no more than a few minutes to setup.\"]]],[1,\"p\",[[0,[],0,\"Whether you need to automate workflows, connect your email list, build a community or embed products from your ecommerce store, our \"],[0,[0],1,\"integrations library\"],[0,[],0,\" has got it all covered with hundreds of tutorials.\"]]],[10,0],[1,\"h2\",[[0,[],0,\"Zapier\"]]],[1,\"p\",[[0,[],0,\"On top of this, you can connect your Ghost site to more than 1,000 external services using the official integration with \"],[0,[1],1,\"Zapier\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Zapier sets up automations with Triggers and Actions, which allows you to create and customise a wide range of connected applications.\"]]],[1,\"blockquote\",[[0,[2],1,\"Example\"],[0,[],0,\": When someone new subscribes to a newsletter on a Ghost site (Trigger) then the contact information is automatically pushed into MailChimp (Action).\"]]],[1,\"p\",[[0,[2],1,\"Here are the most popular Ghost<>Zapier automation templates:\"],[0,[],0,\" \"]]],[10,1],[1,\"h2\",[[0,[],0,\"Custom integrations\"]]],[1,\"p\",[[0,[],0,\"At the heart of Ghost sits a robust JSON API – designed to create, manage and retrieve content with ease. \"]]],[1,\"p\",[[0,[],0,\"It's possible to create custom Ghost integrations with dedicated API keys and webhooks from the Integrations page within Ghost Admin. \"]]],[10,2],[1,\"p\",[[0,[],0,\"Beyond that, the API allows you to build entirely custom publishing apps. You can send content from your favourite desktop editor, build a custom interface for handling editorial workflow or use Ghost as a full headless CMS with a custom front-end.\"]]],[1,\"p\",[[0,[],0,\"The Ghost API is \"],[0,[3],1,\"thoroughly documented\"],[0,[],0,\" and straightforward to work with for developers of almost any level. \"]]],[1,\"h2\",[[0,[],0,\"Final step: Themes\"]]],[1,\"p\",[[0,[],0,\"Alright, on to the last post in our welcome-series! If you're curious about creating your own Ghost theme from scratch, \"],[0,[4],1,\"find out how that works\"],[0,[],0,\".\"]]]]}",
+ "title": "How to grow your business around an audience",
+ "slug": "grow",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}]],\"cards\":[[\"hr\",{}]],\"markups\":[[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/pricing/\"]],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/blog/how-to-create-a-newsletter/\"]],[\"a\",[\"href\",\"https://ghost.org/blog/membership-sites/\"]],[\"a\",[\"href\",\"https://newsletterguide.org/\"]],[\"a\",[\"href\",\"https://ghost.org/blog/find-your-niche-creator-economy/\"]],[\"a\",[\"href\",\"https://ghost.org/blog/newsletter-referral-programs/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"As you grow, you'll probably want to start inviting team members and collaborators to your site. Ghost has a number of different user roles for your team:\"]]],[1,\"p\",[[0,[0],1,\"Contributors\"],[1,[],0,0],[0,[],0,\"This is the base user level in Ghost. Contributors can create and edit their own draft posts, but they are unable to edit drafts of others or publish posts. Contributors are \"],[0,[0],1,\"untrusted\"],[0,[],0,\" users with the most basic access to your publication.\"]]],[1,\"p\",[[0,[0],1,\"Authors\"],[1,[],0,1],[0,[],0,\"Authors are the 2nd user level in Ghost. Authors can write, edit and publish their own posts. Authors are \"],[0,[0],1,\"trusted\"],[0,[],0,\" users. If you don't trust users to be allowed to publish their own posts, they should be set as Contributors.\"]]],[1,\"p\",[[0,[0],1,\"Editors\"],[1,[],0,2],[0,[],0,\"Editors are the 3rd user level in Ghost. Editors can do everything that an Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new Contributors & Authors to the site.\"]]],[1,\"p\",[[0,[0],1,\"Administrators\"],[1,[],0,3],[0,[],0,\"The top user level in Ghost is Administrator. Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings and data, not just content. Additionally, administrators have full access to invite, manage or remove any other user of the site.\"],[1,[],0,4],[1,[],0,5],[0,[0],1,\"The Owner\"],[1,[],0,6],[0,[],0,\"There is only ever one owner of a Ghost site. The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings if applicable. For example: billing details, if using \"],[0,[1,0],2,\"Ghost(Pro)\"],[0,[],0,\".\"]]],[1,\"blockquote\",[[0,[2],1,\"Ask all of your users to fill out their user profiles, including bio and social links. These will populate rich structured data for posts and generally create more opportunities for themes to fully populate their design.\"]]],[10,0],[1,\"p\",[[0,[],0,\"If you're looking for insights, tips and reference materials to expand your content business, here's 5 top resources to get you started:\"]]],[3,\"ul\",[[[0,[3,0],2,\"How to create a premium newsletter (+ some case studies)\"],[0,[0],1,\" \"],[0,[],0,\" \"],[1,[],0,7],[0,[],0,\"Learn how others run successful paid email newsletter products\"]],[[0,[0,4],2,\"The ultimate guide to membership websites for creators\"],[1,[],0,8],[0,[],0,\"Tips to help you build, launch and grow your new membership business\"]],[[0,[0,5],2,\"The Newsletter Guide\"],[1,[],0,9],[0,[],0,\"A 201 guide for taking your newsletters to the next level\"]],[[0,[6,0],2,\"The proven way to find your niche, explained\"],[1,[],0,10],[0,[],0,\"Find the overlap and find a monetizable niche that gets noticed\"]],[[0,[0,7],2,\"Should you launch a referral program? \"],[1,[],0,11],[0,[],0,\"Strategies for building a sustainable referral growth machine\"]]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/admin-settings.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "A guide to collaborating with other staff users to publish, and some resources to help you with the next steps of growing your business",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "Work with all your favourite apps and tools or create your own custom integrations using the Ghost API.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/app-integrations.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
{
- "title": "Organising your content",
- "slug": "organising-content",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}]],\"cards\":[],\"markups\":[[\"code\"],[\"em\"],[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/docs/themes/\"]],[\"a\",[\"href\",\"http://yaml.org/spec/1.2/spec.html\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"https://ghost.org/docs/themes/routing/\"]],[\"a\",[\"href\",\"/apps-integrations/\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Sensible tagging\"]]],[1,\"p\",[[0,[],0,\"You can think of tags like Gmail labels. By tagging posts with one or more keyword, you can organise articles into buckets of related content.\"]]],[1,\"p\",[[0,[],0,\"When you create content for your publication you can assign tags to help differentiate between categories of content. \"]]],[1,\"p\",[[0,[],0,\"For example you may tag some content with News and other content with Podcast, which would create two distinct categories of content listed on \"],[0,[0],1,\"/tag/news/\"],[0,[],0,\" and \"],[0,[0],1,\"/tag/podcast/\"],[0,[],0,\", respectively.\"]]],[1,\"p\",[[0,[],0,\"If you tag a post with both \"],[0,[0],1,\"News\"],[0,[],0,\" \"],[0,[1],1,\"and\"],[0,[],0,\" \"],[0,[0],1,\"Podcast\"],[0,[],0,\" - then it appears in both sections. Tag archives are like dedicated home-pages for each category of content that you have. They have their own pages, their own RSS feeds, and can support their own cover images and meta data.\"]]],[1,\"h3\",[[0,[],0,\"The primary tag\"]]],[1,\"p\",[[0,[],0,\"Inside the Ghost editor, you can drag and drop tags into a specific order. The first tag in the list is always given the most importance, and some themes will only display the primary tag (the first tag in the list) by default. \"]]],[1,\"blockquote\",[[0,[1,2],1,\"News\"],[0,[],1,\", Technology, Startup\"]]],[1,\"p\",[[0,[],0,\"So you can add the most important tag which you want to show up in your theme, but also add related tags which are less important.\"]]],[1,\"h3\",[[0,[],0,\"Private tags\"]]],[1,\"p\",[[0,[],0,\"Sometimes you may want to assign a post a specific tag, but you don't necessarily want that tag appearing in the theme or creating an archive page. In Ghost, hashtags are private and can be used for special styling.\"]]],[1,\"p\",[[0,[],0,\"For example, if you sometimes publish posts with video content - you might want your theme to adapt and get rid of the sidebar for these posts, to give more space for an embedded video to fill the screen. In this case, you could use private tags to tell your theme what to do.\"]]],[1,\"blockquote\",[[0,[1,2],1,\"News\"],[0,[],1,\", #video\"]]],[1,\"p\",[[0,[],0,\"Here, the theme would assign the post publicly displayed tags of News - but it would also keep a private record of the post being tagged with #video. In your theme, you could then look for private tags conditionally and give them special formatting. \"]]],[1,\"blockquote\",[[0,[1],0,\"You can find documentation for theme development techniques like this and many more over on Ghost's extensive \"],[0,[3],1,\"theme docs\"],[0,[],1,\".\"]]],[1,\"h2\",[[0,[],0,\"Dynamic routing\"]]],[1,\"p\",[[0,[],0,\"Dynamic routing gives you the ultimate freedom to build a custom publication to suit your needs. Routes are rules that map URL patterns to your content and templates. \"]]],[1,\"p\",[[0,[],0,\"You may not want content tagged with \"],[0,[0],1,\"News\"],[0,[],0,\" to exist on: \"],[0,[0],1,\"example.com/tag/news\"],[0,[],0,\". Instead, you want it to exist on \"],[0,[0],1,\"example.com/news\"],[0,[],0,\" .\"]]],[1,\"p\",[[0,[],0,\"In this case you can use dynamic routes to create customised collections of content on your site. It's also possible to use multiple templates in your theme to render each content type differently.\"]]],[1,\"p\",[[0,[],0,\"There are lots of use cases for dynamic routing with Ghost, here are a few common examples: \"]]],[3,\"ul\",[[[0,[],0,\"Setting a custom home page with its own template\"]],[[0,[],0,\"Having separate content hubs for blog and podcast, that render differently, and have custom RSS feeds to support two types of content\"]],[[0,[],0,\"Creating a founders column as a unique view, by filtering content created by specific authors\"]],[[0,[],0,\"Including dates in permalinks for your posts\"]],[[0,[],0,\"Setting posts to have a URL relative to their primary tag like \"],[0,[0],1,\"example.com/europe/story-title/\"],[1,[],0,0]]]],[1,\"blockquote\",[[0,[1],0,\"Dynamic routing can be configured in Ghost using \"],[0,[4],1,\"YAML\"],[0,[],0,\" files. Read our dynamic routing \"],[0,[5],1,\"documentation\"],[0,[],1,\" for further details.\"]]],[1,\"h2\",[[0,[],0,\"Next: Apps & Integrations\"]]],[1,\"p\",[[0,[],0,\"Work with all your favourite apps and tools using our \"],[0,[6],1,\"integrations\"],[0,[],0,\", or create your own custom integrations with webhooks.\"]]],[1,\"p\",[]]]}",
+ "title": "Selling premium memberships with recurring revenue",
+ "slug": "sell",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/thebrowser.jpg\",\"width\":1600,\"height\":2000,\"href\":\"https://thebrowser.com\",\"caption\":\"The Browser has over 10,000 paying subscribers\"}],[\"paywall\",{}]],\"markups\":[[\"a\",[\"href\",\"https://stripe.com\"]],[\"strong\"],[\"a\",[\"href\",\"https://stratechery.com\"]],[\"a\",[\"href\",\"https://www.theinformation.com\"]],[\"a\",[\"href\",\"https://thebrowser.com\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"For creators and aspiring entrepreneurs looking to generate a sustainable recurring revenue stream from their creative work, Ghost has built-in payments allowing you to create a subscription commerce business.\"]]],[1,\"p\",[[0,[],0,\"Connect your \"],[0,[0],1,\"Stripe\"],[0,[],0,\" account to Ghost, and you'll be able to quickly and easily create monthly and yearly premium plans for members to subscribe to, as well as complimentary plans for friends and family.\"]]],[1,\"p\",[[0,[],0,\"Ghost takes \"],[0,[1],1,\"0% payment fees\"],[0,[],0,\", so everything you make is yours to keep!\"]]],[1,\"p\",[[0,[],0,\"Using subscriptions, you can build an independent media business like \"],[0,[2],1,\"Stratechery\"],[0,[],0,\", \"],[0,[3],1,\"The Information\"],[0,[],0,\", or \"],[0,[4],1,\"The Browser\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"The creator economy is just getting started, and Ghost allows you to build something based on technology that you own and control.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Most successful subscription businesses publish a mix of free and paid posts to attract a new audience, and upsell the most loyal members to a premium offering. You can also mix different access levels within the same post, showing a free preview to logged out members and then, right when you're ready for a cliffhanger, that's a good time to...\"]]],[10,1],[1,\"p\",[[0,[],0,\"Hold back some of the best bits for paying members only! \"]]],[1,\"p\",[[0,[],0,\"The \"],[0,[1],1,\"Public preview\"],[0,[],0,\" card allows to create a divide between how much of your post should be available as a public free-preview, and how much should be restricted based on the post access level.\"]]],[1,\"p\",[[0,[],0,\"These last paragraphs are only visible on the site if you're logged in as a paying member. To test this out, you can connect a Stripe account, create a member account for yourself, and give yourself a complimentary premium plan.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/organizing-your-content.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "paid",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "Ghost has a flexible organisational taxonomy called tags and the ability to create custom site structures using dynamic routes.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/organising-your-content.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
{
- "title": "Managing admin settings",
- "slug": "admin-settings",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}],[\"soft-return\",\"\",{}]],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v1.0.0/images/private.png\"}]],\"markups\":[[\"em\"],[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/pricing/\"]],[\"a\",[\"href\",\"/organising-content/\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Make your site private\"]]],[1,\"p\",[[0,[],0,\"If you've got a publication that you don't want the world to see yet because it's not ready to launch, you can hide your Ghost site behind a basic shared pass-phrase.\"]]],[1,\"p\",[[0,[],0,\"You can toggle this preference on at the bottom of Ghost's General Settings:\"]]],[10,0],[1,\"p\",[[0,[],0,\"Ghost will give you a short, randomly generated pass-phrase which you can share with anyone who needs access to the site while you're working on it. While this setting is enabled, all search engine optimisation features will be switched off to help keep your site under the radar.\"]]],[1,\"p\",[[0,[],0,\"Do remember though, this is \"],[0,[0],1,\"not\"],[0,[],0,\" secure authentication. You shouldn't rely on this feature for protecting important private data. It's just a simple, shared pass-phrase for some very basic privacy.\"]]],[1,\"h2\",[[0,[],0,\"Invite your team \"]]],[1,\"p\",[[0,[],0,\"Ghost has a number of different user roles for your team:\"]]],[1,\"p\",[[0,[1],1,\"Contributors\"],[1,[],0,0],[0,[],0,\"This is the base user level in Ghost. Contributors can create and edit their own draft posts, but they are unable to edit drafts of others or publish posts. Contributors are \"],[0,[1],1,\"untrusted\"],[0,[],0,\" users with the most basic access to your publication.\"]]],[1,\"p\",[[0,[1],1,\"Authors\"],[1,[],0,1],[0,[],0,\"Authors are the 2nd user level in Ghost. Authors can write, edit and publish their own posts. Authors are \"],[0,[1],1,\"trusted\"],[0,[],0,\" users. If you don't trust users to be allowed to publish their own posts, they should be set as Contributors.\"]]],[1,\"p\",[[0,[1],1,\"Editors\"],[1,[],0,2],[0,[],0,\"Editors are the 3rd user level in Ghost. Editors can do everything that an Author can do, but they can also edit and publish the posts of others - as well as their own. Editors can also invite new Contributors & Authors to the site.\"]]],[1,\"p\",[[0,[1],1,\"Administrators\"],[1,[],0,3],[0,[],0,\"The top user level in Ghost is Administrator. Again, administrators can do everything that Authors and Editors can do, but they can also edit all site settings and data, not just content. Additionally, administrators have full access to invite, manage or remove any other user of the site.\"],[1,[],0,4],[1,[],0,5],[0,[1],1,\"The Owner\"],[1,[],0,6],[0,[],0,\"There is only ever one owner of a Ghost site. The owner is a special user which has all the same permissions as an Administrator, but with two exceptions: The Owner can never be deleted. And in some circumstances the owner will have access to additional special settings if applicable. For example: billing details, if using \"],[0,[2,1],2,\"Ghost(Pro)\"],[0,[],0,\".\"]]],[1,\"blockquote\",[[0,[0],1,\"It's a good idea to ask all of your users to fill out their user profiles, including bio and social links. These will populate rich structured data for posts and generally create more opportunities for themes to fully populate their design.\"]]],[1,\"h2\",[[0,[],0,\"Next: Organising content\"]]],[1,\"p\",[[0,[],0,\"Find out how to \"],[0,[3],1,\"organise your content\"],[0,[],0,\" with sensible tags and authors, or for more advanced configurations, how to create custom content structures using dynamic routing.\"]]]]}",
+ "title": "Building your audience with subscriber signups",
+ "slug": "portal",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/portalsettings.png\",\"width\":2924,\"height\":1810,\"cardWidth\":\"wide\"}],[\"hr\",{}]],\"markups\":[[\"em\"],[\"a\",[\"href\",\"#/portal\"]],[\"a\",[\"href\",\"__GHOST_URL__/sell/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"What sets Ghost apart from other products is that you can publish content and grow your audience using the same platform. Rather than just endlessly posting and hoping someone is listening, you can track real signups against your work and have them subscribe to be notified of future posts. The feature that makes all this possible is called \"],[0,[0],1,\"Portal\"],[0,[],0,\".\"]]],[1,\"p\",[[0,[],0,\"Portal is an embedded interface for your audience to sign up to your site. It works on every Ghost site, with every theme, and for any type of publisher. \"]]],[1,\"p\",[[0,[],0,\"You can customize the design, content and settings of Portal to suit your site, whether you just want people to sign up to your newsletter — or you're running a full premium publication with user sign-ins and private content.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Once people sign up to your site, they'll receive an email confirmation with a link to click. The link acts as an automatic sign-in, so subscribers will be automatically signed-in to your site when they click on it. There are a couple of interesting angles to this:\"]]],[1,\"p\",[[0,[],0,\"Because subscribers are automatically able to sign in and out of your site as registered members: You can (optionally) restrict access to posts and pages depending on whether people are signed-in or not. So if you want to publish some posts for free, but keep some really great stuff for members-only, this can be a great draw to encourage people to sign up!\"]]],[1,\"p\",[[0,[],0,\"Ghost members sign in using email authentication links, so there are no passwords for people to set or forget. You can turn any list of email subscribers into a database of registered members who can sign in to your site. Like magic.\"]]],[1,\"p\",[[0,[],0,\"Portal makes all of this possible, and it appears by default as a floating button in the bottom-right corner of your site. When people are logged out, clicking it will open a sign-up/sign-in window. When members are logged in, clicking the Portal button will open the account menu where they can edit their name, email, and subscription settings.\"]]],[1,\"p\",[[0,[],0,\"The floating Portal button is completely optional. If you prefer, you can add manual links to your content, navigation, or theme to trigger it instead.\"]]],[1,\"p\",[[0,[],0,\"Like this! \"],[0,[1],1,\"Sign up here\"]]],[10,1],[1,\"p\",[[0,[],0,\"As you start to grow your registered audience, you'll be able to get a sense of who you're publishing \"],[0,[0],1,\"for\"],[0,[],0,\" and where those people are coming \"],[0,[0],1,\"from\"],[0,[],0,\". Best of all: You'll have a straightforward, reliable way to connect with people who enjoy your work.\"]]],[1,\"p\",[[0,[],0,\"Social networks go in and out of fashion all the time. Email addresses are timeless.\"]]],[1,\"p\",[[0,[],0,\"Growing your audience is valuable no matter what type of site you run, but if your content \"],[0,[0],1,\"is\"],[0,[],0,\" your business, then you might also be interested in \"],[0,[2],1,\"setting up premium subscriptions\"],[0,[],0,\".\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/creating-a-custom-theme.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "How Ghost allows you to turn anonymous readers into an audience of active subscribers, so you know what's working and what isn't.",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "There are a couple of things to do next while you're getting set up: making your site private and inviting your team.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/admin-settings.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
{
- "title": "Publishing options",
- "slug": "publishing-options",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"code\",{\"code\":\"{\\n \\\"@context\\\": \\\"https://schema.org\\\",\\n \\\"@type\\\": \\\"Article\\\",\\n \\\"publisher\\\": {\\n \\\"@type\\\": \\\"Organization\\\",\\n \\\"name\\\": \\\"Publishing options\\\",\\n \\\"logo\\\": \\\"https://static.ghost.org/ghost-logo.svg\\\"\\n },\\n \\\"author\\\": {\\n \\\"@type\\\": \\\"Person\\\",\\n \\\"name\\\": \\\"Ghost\\\",\\n \\\"url\\\": \\\"http://demo.ghost.io/author/ghost/\\\",\\n \\\"sameAs\\\": []\\n },\\n \\\"headline\\\": \\\"Publishing options\\\",\\n \\\"url\\\": \\\"http://demo.ghost.io/publishing-options\\\",\\n \\\"datePublished\\\": \\\"2018-08-08T11:44:00.000Z\\\",\\n \\\"dateModified\\\": \\\"2018-08-09T12:06:21.000Z\\\",\\n \\\"keywords\\\": \\\"Getting Started\\\",\\n \\\"description\\\": \\\"The Ghost editor has everything you need to fully optimise your content. This is where you can add tags and authors, feature a post, or turn a post into a page.\\\"\\n}\\n \"}]],\"markups\":[[\"strong\"],[\"a\",[\"href\",\"https://schema.org/\"]],[\"a\",[\"href\",\"https://search.google.com/structured-data/testing-tool\",\"rel\",\"noreferrer nofollow noopener\"]],[\"a\",[\"href\",\"/admin-settings/\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Distribute your content\"]]],[1,\"p\",[[0,[],0,\"Access the post settings menu by clicking the settings icon in the top right hand corner of the editor and discover everything you need to get your content ready for publishing. This is where you can edit things like tags, post URL, publish date and custom meta data.\"]]],[1,\"h2\",[[0,[],0,\"Feature images, URL & excerpts\"]]],[1,\"p\",[[0,[],0,\"Insert your post feature image from the very top of the post settings menu. Consider resizing or optimising your image first to ensure it's an appropriate size. Below this, you can set your post URL, publish date and add a custom excerpt.\"]]],[1,\"h2\",[[0,[],0,\"Tags & authors\"]]],[1,\"p\",[[0,[],0,\"You can easily add multiple tags and authors to any post to filter and organise the relationships between your content in Ghost.\"]]],[1,\"h2\",[[0,[],0,\"Structured data & SEO\"]]],[1,\"p\",[[0,[],0,\"There's no need to hard code your meta data. In fact, Ghost will generate default meta data automatically using the content in your post.\"]]],[1,\"p\",[[0,[],0,\"Alternatively, you can override this by adding a custom meta title and description, as well as unique information for social media sharing cards on Facebook and Twitter.\"]]],[1,\"p\",[[0,[],0,\"It's also possible to set custom canonicals, which is useful for guest posts or curated lists of external links.\"]]],[1,\"p\",[[0,[],0,\"Ghost will automatically implement \"],[0,[0],1,\"structured data\"],[0,[],0,\" for your publication using JSON-LD to further optimise your content.\"]]],[10,0],[1,\"p\",[[0,[],0,\"You can test that the structured data \"],[0,[1],1,\"schema\"],[0,[],0,\" on your site is working as it should using \"],[0,[2],1,\"Google’s structured data tool\"],[0,[],0,\". \"]]],[1,\"h2\",[[0,[],0,\"Code injection\"]]],[1,\"p\",[[0,[],0,\"This tool allows you to inject code on a per post or page basis, or across your entire site. This means you can modify CSS, add unique tracking codes, or add other scripts to the head or foot of your publication without making edits to your theme files. \"]]],[1,\"p\",[[0,[0],1,\"To add code site-wide\"],[0,[],0,\", use the code injection tool in the main admin menu. This is useful for adding a Google Analytics tracking code, or to start tracking with any other analytics tool.\"]]],[1,\"p\",[[0,[0],1,\"To add code to a post or page\"],[0,[],0,\", use the code injection tool within the post settings menu. This is useful if you want to add art direction, scripts or styles that are only applicable to one post or page.\"]]],[1,\"h2\",[[0,[],0,\"Next: Admin settings\"]]],[1,\"p\",[[0,[],0,\"Now you understand how to create and optimise content, let's explore some \"],[0,[3],1,\"admin settings\"],[0,[],0,\" so you can invite your team and start collaborating.\"]]]]}",
+ "title": "Writing and managing content in Ghost, an advanced guide",
+ "slug": "write",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/editor.png\",\"width\":3182,\"height\":1500,\"cardWidth\":\"wide\",\"caption\":\"The Ghost editor. Also available in dark-mode, for late night writing sessions.\"}],[\"bookmark\",{\"type\":\"bookmark\",\"url\":\"https://opensubscriptionplatforms.com/\",\"metadata\":{\"url\":\"https://opensubscriptionplatforms.com\",\"title\":\"Open Subscription Platforms\",\"description\":\"A shared movement for independent subscription data.\",\"author\":null,\"publisher\":\"Open Subscription Platforms\",\"thumbnail\":\"https://opensubscriptionplatforms.com/images/osp-card.png\",\"icon\":\"https://opensubscriptionplatforms.com/images/favicon.png\"}}],[\"embed\",{\"url\":\"https://www.youtube.com/watch?v=hmH3XMlms8E\",\"html\":\"\",\"type\":\"video\",\"metadata\":{\"title\":\"\\\"VELA\\\" Episode 1 of 4 | John John Florence\",\"author_name\":\"John John Florence\",\"author_url\":\"https://www.youtube.com/c/JJF\",\"height\":113,\"width\":200,\"version\":\"1.0\",\"provider_name\":\"YouTube\",\"provider_url\":\"https://www.youtube.com/\",\"thumbnail_height\":360,\"thumbnail_width\":480,\"thumbnail_url\":\"https://i.ytimg.com/vi/hmH3XMlms8E/hqdefault.jpg\"}}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/andreas-selter-xSMqGH7gi6o-unsplash.jpg\",\"width\":6000,\"height\":4000,\"cardWidth\":\"full\",\"caption\":\"\"}],[\"gallery\",{\"images\":[{\"fileName\":\"andreas-selter-e4yK8QQlZa0-unsplash.jpg\",\"row\":0,\"width\":4572,\"height\":3048,\"src\":\"https://static.ghost.org/v4.0.0/images/andreas-selter-e4yK8QQlZa0-unsplash.jpg\"},{\"fileName\":\"steve-carter-Ixp4YhCKZkI-unsplash.jpg\",\"row\":0,\"width\":4032,\"height\":2268,\"src\":\"https://static.ghost.org/v4.0.0/images/steve-carter-Ixp4YhCKZkI-unsplash.jpg\"}],\"caption\":\"\"}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/lukasz-szmigiel-jFCViYFYcus-unsplash.jpg\",\"width\":2560,\"height\":1705,\"cardWidth\":\"wide\"}],[\"gallery\",{\"images\":[{\"fileName\":\"jd-mason-hPiEFq6-Eto-unsplash.jpg\",\"row\":0,\"width\":5184,\"height\":3888,\"src\":\"https://static.ghost.org/v4.0.0/images/jd-mason-hPiEFq6-Eto-unsplash.jpg\"},{\"fileName\":\"jp-valery-OBpOP9GVH9U-unsplash.jpg\",\"row\":0,\"width\":5472,\"height\":3648,\"src\":\"https://static.ghost.org/v4.0.0/images/jp-valery-OBpOP9GVH9U-unsplash.jpg\"}],\"caption\":\"Peaceful places\"}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/createsnippet.png\",\"width\":2282,\"height\":1272,\"cardWidth\":\"wide\"}],[\"hr\",{}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/preview.png\",\"width\":3166,\"height\":2224,\"cardWidth\":\"wide\"}],[\"hr\",{}]],\"markups\":[[\"em\"],[\"code\"]],\"sections\":[[1,\"p\",[[0,[],0,\"Ghost comes with a best-in-class editor which does its very best to get out of the way, and let you focus on your content. Don't let its minimal looks fool you, though, beneath the surface lies a powerful editing toolset designed to accommodate the extensive needs of modern creators.\"]]],[1,\"p\",[[0,[],0,\"For many, the base canvas of the Ghost editor will feel familiar. You can start writing as you would expect, highlight content to access the toolbar you would expect, and generally use all of the keyboard shortcuts you would expect.\"]]],[1,\"p\",[[0,[],0,\"Our main focus in building the Ghost editor is to try and make as many things that you hope/expect might work: actually work. \"]]],[3,\"ul\",[[[0,[],0,\"You can copy and paste raw content from web pages, and Ghost will do its best to correctly preserve the formatting. \"]],[[0,[],0,\"Pasting an image from your clipboard will upload inline.\"]],[[0,[],0,\"Pasting a social media URL will automatically create an embed.\"]],[[0,[],0,\"Highlight a word in the editor and paste a URL from your clipboard on top: Ghost will turn it into a link.\"]],[[0,[],0,\"You can also paste (or write!) Markdown and Ghost will usually be able to auto-convert it into fully editable, formatted content.\"]]]],[10,0],[1,\"p\",[[0,[],0,\"The goal, as much as possible, is for things to work so that you don't have to \"],[0,[0],1,\"think\"],[0,[],0,\" so much about the editor. You won't find any disastrous \\\"block builders\\\" here, where you have to open 6 submenus and choose from 18 different but identical alignment options. That's not what Ghost is about.\"]]],[1,\"p\",[[0,[],0,\"What you will find though, is dynamic cards which allow you to embed rich media into your posts and create beautifully laid out stories.\"]]],[1,\"h2\",[[0,[],0,\"Using cards\"]]],[1,\"p\",[[0,[],0,\"You can insert dynamic cards inside post content using the \"],[0,[1],1,\"+\"],[0,[],0,\" button, which appears on new lines, or by typing \"],[0,[1],1,\"/\"],[0,[],0,\" on a new line to trigger the card menu. Many of the choices are simple and intuitive, like bookmark cards, which allow you to create rich links with embedded structured data:\"]]],[10,1],[1,\"p\",[[0,[],0,\"or embed cards which make it easy to insert content you want to share with your audience, from external services:\"]]],[10,2],[1,\"p\",[[0,[],0,\"But, dig a little deeper, and you'll also find more advanced cards, like one that only shows up in email newsletters (great for personalized introductions) and a comprehensive set of specialized cards for different types of images and galleries.\"]]],[1,\"blockquote\",[[0,[],0,\"Once you start mixing text and image cards creatively, the whole narrative of the story changes. Suddenly, you're working in a new format.\"]]],[10,3],[1,\"p\",[[0,[],0,\"As it turns out, sometimes pictures and a thousand words go together really well. Telling people a great story often has much more impact if they can feel, even for a moment, as though they were right there with you.\"]]],[10,4],[10,5],[10,6],[1,\"p\",[[0,[],0,\"Galleries and image cards can be combined in so many different ways — the only limit is your imagination.\"]]],[1,\"h2\",[[0,[],0,\"Build workflows with snippets\"]]],[1,\"p\",[[0,[],0,\"One of the most powerful features of the Ghost editor is the ability to create and re-use content snippets. If you've ever used an email client with a concept of \"],[0,[0],1,\"saved replies\"],[0,[],0,\" then this will be immediately intuitive.\"]]],[1,\"p\",[[0,[],0,\"To create a snippet, select a piece of content in the editor that you'd like to re-use in future, then click on the snippet icon in the toolbar. Give your snippet a name, and you're all done. Now your snippet will be available from within the card menu, or you can search for it directly using the \"],[0,[1],1,\"/\"],[0,[],0,\" command.\"]]],[1,\"p\",[[0,[],0,\"This works really well for saving images you might want to use often, like a company logo or team photo, links to resources you find yourself often linking to, or introductions and passages that you want to remember.\"]]],[10,7],[1,\"p\",[[0,[],0,\"You can even build entire post templates or outlines to create a quick, re-usable workflow for publishing over time. Or build custom design elements for your post with an HTML card, and use a snippet to insert it.\"]]],[1,\"p\",[[0,[],0,\"Once you get a few useful snippets set up, it's difficult to go back to the old way of diving through media libraries and trawling for that one thing you know you used somewhere that one time.\"]]],[10,8],[1,\"h2\",[[0,[],0,\"Publishing and newsletters the easy way\"]]],[1,\"p\",[[0,[],0,\"When you're ready to publish, Ghost makes it as simple as possible to deliver your new post to all your existing members. Just hit the \"],[0,[0],1,\"Preview\"],[0,[],0,\" link and you'll get a chance to see what your content looks like on Web, Mobile, Email and Social.\"]]],[10,9],[1,\"p\",[[0,[],0,\"You can send yourself a test newsletter to make sure everything looks good in your email client, and then hit the \"],[0,[0],1,\"Publish\"],[0,[],0,\" button to decide who to deliver it to.\"]]],[1,\"p\",[[0,[],0,\"Ghost comes with a streamlined, optimized email newsletter template that has settings built-in for you to customize the colors and typography. We've spent countless hours refining the template to make sure it works great across all email clients, and performs well for email deliverability.\"]]],[1,\"p\",[[0,[],0,\"So, you don't need to fight the awful process of building a custom email template from scratch. It's all done already!\"]]],[10,10],[1,\"p\",[[0,[],0,\"The Ghost editor is powerful enough to do whatever you want it to do. With a little exploration, you'll be up and running in no time.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/writing-posts-with-ghost.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "A full overview of all the features built into the Ghost editor, including powerful workflow automations to speed up your creative process.",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "The Ghost editor post settings menu has everything you need to fully optimise and distribute your content effectively.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/publishing-options.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
+
{
- "title": "Writing posts with Ghost ✍️",
- "slug": "the-editor",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v2.0.0/images/formatting-editor-demo.gif\"}],[\"code\",{\"code\":\"\\n
\\n {{> \\\"site-nav\\\"}}\\n
\\n\"}],[\"bookmark\",{\"type\":\"bookmark\",\"url\":\"https://ghost.org/\",\"metadata\":{\"url\":\"https://ghost.org\",\"title\":\"Ghost: The #1 open source headless Node.js CMS\",\"description\":\"The world’s most popular modern open source publishing platform. A headless Node.js CMS used by Apple, Sky News, Tinder and thousands more. MIT licensed, with 30k+ stars on Github.\",\"author\":null,\"publisher\":\"Ghost\",\"thumbnail\":\"https://ghost.org/images/meta/Ghost.png\",\"icon\":\"https://ghost.org/icons/icon-512x512.png?v=188b8b6d743c6338ba2eab2e35bab4f5\"}}],[\"image\",{\"src\":\"https://static.ghost.org/v3.0.0/images/image-sizes-ghost-editor.png\"}],[\"gallery\",{\"images\":[{\"fileName\":\"gallery-sample-1.jpg\",\"row\":0,\"width\":6000,\"height\":4000,\"src\":\"https://static.ghost.org/v3.0.0/images/gallery-sample-1.jpg\"},{\"fileName\":\"gallery-sample-2.jpg\",\"row\":0,\"width\":5746,\"height\":3831,\"src\":\"https://static.ghost.org/v3.0.0/images/gallery-sample-2.jpg\"},{\"fileName\":\"gallery-sample-3.jpg\",\"row\":0,\"width\":5872,\"height\":3915,\"src\":\"https://static.ghost.org/v3.0.0/images/gallery-sample-3.jpg\"}]}]],\"markups\":[[\"strong\"],[\"code\"],[\"a\",[\"href\",\"/publishing-options/\"]]],\"sections\":[[1,\"h2\",[[0,[],0,\"Just start writing\"]]],[1,\"p\",[[0,[],0,\"Ghost has a powerful visual editor with familiar formatting options, as well as the ability to add dynamic content.\"]]],[1,\"p\",[[0,[],0,\"Select your text to add formatting such as headers or to create links. Or use Markdown shortcuts to do the work for you - if that's your thing. \"]]],[10,0],[1,\"h2\",[[0,[],0,\"Rich editing at your fingertips\"]]],[1,\"p\",[[0,[],0,\"The editor can also handle rich media objects, called \"],[0,[0],1,\"cards\"],[0,[],0,\", which can be organised and re-ordered using drag and drop. \"]]],[1,\"p\",[[0,[],0,\"You can insert a card either by clicking the \"],[0,[1],1,\"+\"],[0,[],0,\" button, or typing \"],[0,[1],1,\"/\"],[0,[],0,\" on a new line to search for a particular card. This allows you to efficiently insert\"],[0,[0],1,\" images\"],[0,[],0,\", \"],[0,[0],1,\"markdown\"],[0,[],0,\", \"],[0,[0],1,\"html, embeds \"],[0,[],0,\"and more.\"]]],[1,\"p\",[[0,[0],1,\"For example\"],[0,[],0,\":\"]]],[3,\"ul\",[[[0,[],0,\"Insert a video from YouTube directly by pasting the URL\"]],[[0,[],0,\"Create unique content like buttons or forms using the HTML card\"]],[[0,[],0,\"Need to share some code? Embed code blocks directly \"]]]],[10,1],[1,\"p\",[[0,[],0,\"It's also possible to share links from across the web in a visual way using bookmark cards that automatically render information from a websites meta data. Paste any URL to try it out: \"]]],[10,2],[1,\"h2\",[[0,[],0,\"Working with images in posts\"]]],[1,\"p\",[[0,[],0,\"You can add images to your posts in many ways:\"]]],[3,\"ul\",[[[0,[],0,\"Upload from your computer\"]],[[0,[],0,\"Click and drag an image into the browser\"]],[[0,[],0,\"Paste directly into the editor from your clipboard\"]],[[0,[],0,\"Insert using a URL\"]]]],[1,\"h3\",[[0,[],0,\"Image sizes\"]]],[1,\"p\",[[0,[],0,\"Once inserted you can blend images beautifully into your content at different sizes and add captions and alt tags wherever needed.\"]]],[10,3],[1,\"h3\",[[0,[],0,\"Image galleries\"]]],[1,\"p\",[[0,[],0,\"Tell visual stories using the gallery card to add up to 9 images that will display as a responsive image gallery: \"]]],[10,4],[1,\"h3\",[[0,[],0,\"Image optimisation\"]]],[1,\"p\",[[0,[],0,\"Ghost will automatically resize and optimise your images with lossless compression. Your posts will be fully optimised for the web without any extra effort on your part.\"]]],[1,\"h2\",[[0,[],0,\"Next: Publishing Options\"]]],[1,\"p\",[[0,[],0,\"Once your post is looking good, you'll want to use the \"],[0,[2],1,\"publishing options\"],[0,[],0,\" to ensure it gets distributed in the right places, with custom meta data, feature images and more.\"]]],[1,\"p\",[]]]}",
+ "title": "Customizing your brand and design settings",
+ "slug": "design",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/brandsettings.png\",\"width\":3456,\"height\":2338,\"cardWidth\":\"wide\",\"caption\":\"Ghost Admin → Settings → Branding\"}],[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/themesettings.png\",\"width\":3208,\"height\":1618,\"cardWidth\":\"wide\",\"caption\":\"Ghost Admin → Settings → Theme\"}],[\"code\",{\"code\":\"{{#post}}\\n\\n\\n
{{title}}
\\n \\n {{#if feature_image}}\\n \\t\\n {{/if}}\\n \\n {{content}}\\n\\n\\n{{/post}}\",\"language\":\"handlebars\",\"caption\":\"A snippet from a post template\"}]],\"markups\":[[\"a\",[\"href\",\"__GHOST_URL__/welcome/\"]],[\"strong\"],[\"em\"],[\"a\",[\"href\",\"https://ghost.org/themes/\"]],[\"a\",[\"href\",\"https://github.com/tryghost/casper/\"]],[\"a\",[\"href\",\"https://ghost.org/docs/themes/\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"As discussed in the \"],[0,[0],1,\"introduction\"],[0,[],0,\" post, one of the best things about Ghost is just how much you can customize to turn your site into something unique. Everything about your layout and design can be changed, so you're not stuck with yet another clone of a social network profile.\"]]],[1,\"p\",[[0,[],0,\"How far you want to go with customization is completely up to you, there's no right or wrong approach! The majority of people use one of Ghost's built-in themes to get started, and then progress to something more bespoke later on as their site grows. \"]]],[1,\"p\",[[0,[],0,\"The best way to get started is with Ghost's branding settings, where you can set up colors, images and logos to fit with your brand.\"]]],[10,0],[1,\"p\",[[0,[],0,\"Any Ghost theme that's up to date and compatible with Ghost 4.0 and higher will reflect your branding settings in the preview window, so you can see what your site will look like as you experiment with different options.\"]]],[1,\"p\",[[0,[],0,\"When selecting an accent color, try to choose something which white text contrast well with. Many themes will use your accent color as the background for buttons, headers and navigational elements. Vibrant colors with a darker hue tend to work best, as a general rule.\"]]],[1,\"h2\",[[0,[],0,\"Installing Ghost themes\"]]],[1,\"p\",[[0,[],0,\"By default, new sites are created with Ghost's friendly publication theme, called Casper. Everything in Casper is optimized to work for the most common types of blog, newsletter and publication that people create with Ghost — so it's a perfect place to start.\"]]],[1,\"p\",[[0,[],0,\"However, there are hundreds of different themes available to install, so you can pick out a look and feel that suits you best.\"]]],[10,1],[1,\"p\",[[0,[],0,\"Inside Ghost's theme settings you'll find 4 more official themes that can be directly installed and activated. Each theme is suited to slightly different use-cases.\"]]],[3,\"ul\",[[[0,[1],1,\"Casper\"],[0,[],0,\" \"],[0,[2],1,\"(default)\"],[0,[],0,\" — Made for all sorts of blogs and newsletters\"]],[[0,[1],1,\"Edition\"],[0,[],0,\" — A beautiful minimal template for newsletter authors\"]],[[0,[1],1,\"Alto\"],[0,[],0,\" — A slick news/magazine style design for creators\"]],[[0,[1],1,\"London\"],[0,[],0,\" — A light photography theme with a bold grid\"]],[[0,[1],1,\"Ease\"],[0,[],0,\" — A library theme for organizing large content archives\"]]]],[1,\"p\",[[0,[],0,\"And if none of those feel quite right, head on over to the \"],[0,[3],1,\"Ghost Marketplace\"],[0,[],0,\", where you'll find a huge variety of both free and premium themes.\"]]],[1,\"h2\",[[0,[],0,\"Building something custom\"]]],[1,\"p\",[[0,[],0,\"Finally, if you want something completely bespoke for your site, you can always build a custom theme from scratch and upload it to your site.\"]]],[1,\"p\",[[0,[],0,\"Ghost's theming template files are very easy to work with, and can be picked up in the space of a few hours by anyone who has just a little bit of knowledge of HTML and CSS. Templates from other platforms can also be ported to Ghost with relatively little effort.\"]]],[1,\"p\",[[0,[],0,\"If you want to take a quick look at the theme syntax to see what it's like, you can \"],[0,[4],1,\"browse through the files of the default Casper theme\"],[0,[],0,\". We've added tons of inline code comments to make it easy to learn, and the structure is very readable.\"]]],[10,2],[1,\"p\",[[0,[],0,\"See? Not that scary! But still completely optional. \"]]],[1,\"p\",[[0,[],0,\"If you're interested in creating your own Ghost theme, check out our extensive \"],[0,[5],1,\"theme documentation\"],[0,[],0,\" for a full guide to all the different template variables and helpers which are available.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/publishing-options.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "How to tweak a few settings in Ghost to transform your site from a generic template to a custom brand with style and personality.",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "Discover familiar formatting options in a functional toolbar and the ability to add dynamic content seamlessly.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/writing-posts-with-ghost.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
},
{
- "title": "Welcome to Ghost",
+ "title": "Start here for a quick overview of everything you need to know",
"slug": "welcome",
- "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"strong\"],[\"a\",[\"href\",\"https://ghost.org/integrations/\"]],[\"a\",[\"href\",\"https://ghost.org/pricing\"]],[\"a\",[\"href\",\"https://github.com/TryGhost\"]],[\"a\",[\"href\",\"/the-editor/\"]]],\"sections\":[[1,\"h2\",[[0,[0],1,\"A few things you should know\"]]],[3,\"ol\",[[[0,[],0,\"Ghost is designed for ambitious, professional publishers who want to actively build a business around their content. That's who it works best for. \"]],[[0,[],0,\"The entire platform can be modified and customised to suit your needs. It's very powerful, but does require some knowledge of code. Ghost is not necessarily a good platform for beginners or people who just want a simple personal blog. \"]],[[0,[],0,\"It's possible to work with all your favourite tools and apps with hundreds of \"],[0,[1],1,\"integrations\"],[0,[],0,\" to speed up your workflows, connect email lists, build communities and much more.\"]]]],[1,\"h2\",[[0,[],0,\"Behind the scenes\"]]],[1,\"p\",[[0,[],0,\"Ghost is made by an independent non-profit organisation called the Ghost Foundation. We are 100% self funded by revenue from our \"],[0,[2],1,\"Ghost(Pro)\"],[0,[],0,\" service, and every penny we make is re-invested into funding further development of free, open source technology for modern publishing.\"]]],[1,\"p\",[[0,[],0,\"The version of Ghost you are looking at right now would not have been made possible without generous contributions from the open source \"],[0,[3],1,\"community\"],[0,[],0,\".\"]]],[1,\"h2\",[[0,[],0,\"Next up, the editor\"]]],[1,\"p\",[[0,[],0,\"The main thing you'll want to read about next is probably: \"],[0,[4],1,\"the Ghost editor\"],[0,[],0,\". This is where the good stuff happens.\"]]],[1,\"blockquote\",[[0,[],0,\"By the way, once you're done reading, you can simply delete the default Ghost user from your team to remove all of these introductory posts! \"]]]]}",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"hr\",{}],[\"hr\",{}]],\"markups\":[[\"strong\"],[\"a\",[\"href\",\"__GHOST_URL__/design/\"]],[\"a\",[\"href\",\"__GHOST_URL__/write/\"]],[\"a\",[\"href\",\"__GHOST_URL__/portal/\"]],[\"a\",[\"href\",\"__GHOST_URL__/sell/\"]],[\"a\",[\"href\",\"__GHOST_URL__/grow/\"]],[\"a\",[\"href\",\"__GHOST_URL__/integrations/\"]],[\"a\",[\"href\",\"https://ghost.org/blog/\"]],[\"a\",[\"href\",\"https://ghost.org/pricing/\"]],[\"em\"],[\"a\",[\"href\",\"https://forum.ghost.org\"]]],\"sections\":[[1,\"p\",[[0,[0],1,\"Hey there\"],[0,[],0,\", welcome to your new home on the web! \"]]],[1,\"p\",[[0,[],0,\"Unlike social networks, this one is all yours. Publish your work on a custom domain, invite your audience to subscribe, send them new content by email newsletter, and offer premium subscriptions to generate sustainable recurring revenue to fund your work. \"]]],[1,\"p\",[[0,[],0,\"Ghost is an independent, open source app, which means you can customize absolutely everything. Inside the admin area, you'll find straightforward controls for changing themes, colors, navigation, logos and settings — so you can set your site up just how you like it. No technical knowledge required.\"]]],[1,\"p\",[[0,[],0,\"If you're feeling a little more adventurous, there's really no limit to what's possible. With just a little bit of HTML and CSS you can modify or build your very own theme from scratch, or connect to Zapier to explore advanced integrations. Advanced developers can go even further and build entirely custom workflows using the Ghost API.\"]]],[1,\"p\",[[0,[],0,\"This level of customization means that Ghost grows with you. It's easy to get started, but there's always another level of what's possible. So, you won't find yourself outgrowing the app in a few months time and wishing you'd chosen something more powerful!\"]]],[10,0],[1,\"p\",[[0,[],0,\"For now, you're probably just wondering what to do first. To help get you going as quickly as possible, we've populated your site with starter content (like this post!) covering all the key concepts and features of the product.\"]]],[1,\"p\",[[0,[],0,\"You'll find an outline of all the different topics below, with links to each section so you can explore the parts that interest you most.\"]]],[1,\"p\",[[0,[],0,\"Once you're ready to begin publishing and want to clear out these starter posts, you can delete the \\\"Ghost\\\" staff user. Deleting an author will automatically remove all of their posts, leaving you with a clean blank canvas.\"]]],[1,\"h2\",[[0,[],0,\"Your guide to Ghost\"]]],[3,\"ul\",[[[0,[1],1,\"Customizing your brand and site settings\"]],[[0,[2],1,\"Writing & managing content, an advanced guide for creators\"]],[[0,[3],1,\"Building your audience with subscriber signups\"]],[[0,[4],1,\"Selling premium memberships with recurring revenue\"]],[[0,[5],1,\"How to grow your business around an audience\"]],[[0,[6],1,\"Setting up custom integrations and apps\"]]]],[1,\"p\",[[0,[],0,\"If you get through all those and you're hungry for more, you can find an extensive library of content for creators over on \"],[0,[7],1,\"the Ghost blog\"],[0,[],0,\".\"]]],[10,1],[1,\"h2\",[[0,[],0,\"Getting help\"]]],[1,\"p\",[[0,[],0,\"If you need help, \"],[0,[8],1,\"Ghost(Pro)\"],[0,[],0,\" customers can always reach our full-time support team by clicking on the \"],[0,[9],1,\"Ghost(Pro)\"],[0,[],0,\" link inside their admin panel.\"]]],[1,\"p\",[[0,[],0,\"If you're a developer working with the codebase in a self-managed install, check out our \"],[0,[10],1,\"developer community forum\"],[0,[],0,\" to chat with other users.\"]]],[1,\"p\",[[0,[],0,\"Have fun!\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": "https://static.ghost.org/v4.0.0/images/welcome-to-ghost.png",
"featured": false,
"type": "post",
"status": "published",
- "meta_title": null,
- "meta_description": null,
+ "visibility": "public",
+ "custom_excerpt": "We've crammed the most important information to help you get started with Ghost into this one post. It's your cheat-sheet to get started, and your shortcut to advanced features.",
"created_by": "5951f5fca366002ebd5dbef7",
"published_by": "5951f5fca366002ebd5dbef7",
- "author_id": "5951f5fca366002ebd5dbef7",
- "custom_excerpt": "Welcome, it's great to have you here.\nWe know that first impressions are important, so we've populated your new site with some initial getting started posts that will help you get familiar with everything in no time.",
- "feature_image": "https://static.ghost.org/v3.0.0/images/welcome-to-ghost.png"
+ "author_id": "5951f5fca366002ebd5dbef7"
+ },
+ {
+ "title": "About this site",
+ "slug": "about",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"strong\"],[\"code\"]],\"sections\":[[1,\"p\",[[0,[],0,\"Unlike posts, pages in Ghost don't appear the main feed. They're separate, individual pages which only show up when you link to them. Great for content which is important, but separate from your usual posts.\"]]],[1,\"p\",[[0,[],0,\"An about page is a great example of one you might want to set up early on so people can find out more about you, and what you do. Why should people subscribe to your site and become a member? Details help!\"]]],[1,\"blockquote\",[[0,[0],1,\"Tip: \"],[0,[],0,\"If you're reading any post or page on your site and you notice something you want to edit, you can add \"],[0,[1],1,\"/edit\"],[0,[],0,\" to the end of the URL – and you'll be taken directly to the Ghost editor.\"]]],[1,\"p\",[[0,[],0,\"Now tell the world what your site is all about.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": null,
+ "featured": false,
+ "type": "page",
+ "status": "published",
+ "visibility": "public",
+ "custom_excerpt": null,
+ "created_by": "5951f5fca366002ebd5dbef7",
+ "published_by": "5951f5fca366002ebd5dbef7",
+ "author_id": "5951f5fca366002ebd5dbef7"
+ },
+ {
+ "title": "Contact",
+ "slug": "contact",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[[\"image\",{\"src\":\"https://static.ghost.org/v4.0.0/images/integrations.png\",\"width\":2944,\"height\":1716,\"href\":\"https://ghost.org/integrations/?tag=forms\"}]],\"markups\":[[\"a\",[\"href\",\"https://twitter.com/ghost\"]],[\"a\",[\"href\",\"https://www.facebook.com/ghost\"]],[\"a\",[\"href\",\"https://instagram.com/ghost\"]]],\"sections\":[[1,\"p\",[[0,[],0,\"If you want to set up a contact page for people to be able to reach out to you, the simplest way is to set up a simple page like this and list the different ways people can reach out to you.\"]]],[1,\"h3\",[[0,[],0,\"For example, here's how to reach us!\"]]],[3,\"ul\",[[[0,[0],1,\"@Ghost\"],[0,[],0,\" on Twitter\"]],[[0,[1],1,\"@Ghost\"],[0,[],0,\" on Facebook\"]],[[0,[2],1,\"@Ghost\"],[0,[],0,\" on Instagram\"]]]],[1,\"p\",[[0,[],0,\"If you prefer to use a contact form, almost all of the great embedded form services work great with Ghost and are easy to set up:\"]]],[10,0],[1,\"p\",[]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": null,
+ "featured": false,
+ "type": "page",
+ "status": "published",
+ "visibility": "public",
+ "created_by": "5951f5fca366002ebd5dbef7",
+ "published_by": "5951f5fca366002ebd5dbef7",
+ "author_id": "5951f5fca366002ebd5dbef7"
+ },
+ {
+ "title": "Privacy",
+ "slug": "privacy",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[],\"sections\":[[1,\"p\",[[0,[],0,\"Wondering how Ghost fares when it comes to privacy and GDPR rules? Good news: Ghost does not use any tracking cookies of any kind.\"]]],[1,\"p\",[[0,[],0,\"You can integrate any products, services, ads or integrations with Ghost yourself if you want to, but it's always a good idea to disclose how subscriber data will be used by putting together a privacy page.\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": null,
+ "featured": false,
+ "type": "page",
+ "status": "published",
+ "visibility": "public",
+ "created_by": "5951f5fca366002ebd5dbef7",
+ "published_by": "5951f5fca366002ebd5dbef7",
+ "author_id": "5951f5fca366002ebd5dbef7"
+ },
+ {
+ "title": "Contribute",
+ "slug": "contribute",
+ "mobiledoc": "{\"version\":\"0.3.1\",\"atoms\":[],\"cards\":[],\"markups\":[[\"a\",[\"href\",\"https://github.com/tryghost\"]],[\"a\",[\"href\",\"https://github.com/sponsors/TryGhost\"]],[\"a\",[\"href\",\"https://opencollective.com/ghost\"]],[\"strong\"]],\"sections\":[[1,\"p\",[[0,[],0,\"Oh hey, you clicked every link of our starter content and even clicked this small link in the footer! If you like Ghost and you're enjoying the product so far, we'd hugely appreciate your support in any way you care to show it.\"]]],[1,\"p\",[[0,[],0,\"Ghost is a non-profit organization, and we give away all our intellectual property as open source software. If you believe in what we do, there are a number of ways you can give us a hand, and we hugely appreciate all of them:\"]]],[3,\"ul\",[[[0,[],0,\"Contribute code via \"],[0,[0],1,\"GitHub\"]],[[0,[],0,\"Contribute financially via \"],[0,[1],1,\"GitHub Sponsors\"]],[[0,[],0,\"Contribute financially via \"],[0,[2],1,\"Open Collective\"]],[[0,[],0,\"Contribute reviews via \"],[0,[3],1,\"writing a blog post\"]],[[0,[],0,\"Contribute good vibes via \"],[0,[3],1,\"telling your friends\"],[0,[],0,\" about us\"]]]],[1,\"p\",[[0,[],0,\"Thanks for checking us out!\"]]]],\"ghostVersion\":\"4.0\"}",
+ "feature_image": null,
+ "featured": false,
+ "type": "page",
+ "status": "published",
+ "visibility": "public",
+ "created_by": "5951f5fca366002ebd5dbef7",
+ "published_by": "5951f5fca366002ebd5dbef7",
+ "author_id": "5951f5fca366002ebd5dbef7"
}
]
},
@@ -730,13 +776,13 @@
"match": "name"
},
"entries": {
- "themes": ["Getting Started"],
- "apps-integrations": ["Getting Started"],
- "organising-content": ["Getting Started"],
- "admin-settings": ["Getting Started"],
- "publishing-options": ["Getting Started"],
- "the-editor": ["Getting Started"],
- "welcome": ["Getting Started"]
+ "integrations": ["Getting Started"],
+ "grow": ["Getting Started"],
+ "design": ["Getting Started"],
+ "write": ["Getting Started"],
+ "welcome": ["Getting Started"],
+ "portal": ["Getting Started"],
+ "sell": ["Getting Started"]
}
},
{
diff --git a/test/api-acceptance/admin/pages_spec.js b/test/api-acceptance/admin/pages_spec.js
index ffdf634b01..64ea77e4ae 100644
--- a/test/api-acceptance/admin/pages_spec.js
+++ b/test/api-acceptance/admin/pages_spec.js
@@ -26,7 +26,7 @@ describe('Pages API', function () {
const jsonResponse = res.body;
should.exist(jsonResponse.pages);
localUtils.API.checkResponse(jsonResponse, 'pages');
- jsonResponse.pages.should.have.length(2);
+ jsonResponse.pages.should.have.length(6);
localUtils.API.checkResponse(jsonResponse.pages[0], 'page');
localUtils.API.checkResponse(jsonResponse.meta.pagination, 'pagination');
@@ -34,7 +34,7 @@ describe('Pages API', function () {
// Absolute urls by default
jsonResponse.pages[0].url.should.match(new RegExp(`${config.get('url')}/p/[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}`));
- jsonResponse.pages[1].url.should.eql(`${config.get('url')}/static-page-test/`);
+ jsonResponse.pages[1].url.should.eql(`${config.get('url')}/contribute/`);
});
it('Can add a page', async function () {
diff --git a/test/api-acceptance/admin/posts_spec.js b/test/api-acceptance/admin/posts_spec.js
index 56dae9d46f..978662f288 100644
--- a/test/api-acceptance/admin/posts_spec.js
+++ b/test/api-acceptance/admin/posts_spec.js
@@ -72,7 +72,7 @@ describe('Posts API', function () {
_.isBoolean(jsonResponse.posts[0].featured).should.eql(true);
// ensure order works
- jsonResponse.posts[0].slug.should.eql('apps-integrations');
+ jsonResponse.posts[0].slug.should.eql('portal');
});
it('Can include single relation', async function () {
diff --git a/test/api-acceptance/content/pages_spec.js b/test/api-acceptance/content/pages_spec.js
index 53c4cafb1e..14b1467541 100644
--- a/test/api-acceptance/content/pages_spec.js
+++ b/test/api-acceptance/content/pages_spec.js
@@ -34,9 +34,9 @@ describe('Pages Content API', function () {
const jsonResponse = res.body;
should.exist(jsonResponse.pages);
should.exist(jsonResponse.meta);
- jsonResponse.pages.should.have.length(1);
+ jsonResponse.pages.should.have.length(5);
- res.body.pages[0].slug.should.eql(testUtils.DataGenerator.Content.posts[5].slug);
+ res.body.pages[0].slug.should.eql('about');
const urlParts = url.parse(res.body.pages[0].url);
should.exist(urlParts.protocol);
diff --git a/test/api-acceptance/content/posts_spec.js b/test/api-acceptance/content/posts_spec.js
index bafe8849e6..cacb14e240 100644
--- a/test/api-acceptance/content/posts_spec.js
+++ b/test/api-acceptance/content/posts_spec.js
@@ -45,7 +45,7 @@ describe('Posts Content API', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -245,7 +245,7 @@ describe('Posts Content API', function () {
const post = res.body.posts[0];
const publishedAt = moment(post.published_at).format('YYYY-MM-DD HH:mm:ss');
- post.title.should.eql('Welcome to Ghost');
+ post.title.should.eql('Start here for a quick overview of everything you need to know');
const res2 = await request
.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&limit=1&filter=${createFilter(publishedAt, `<`)}`))
@@ -258,7 +258,7 @@ describe('Posts Content API', function () {
const post2 = res2.body.posts[0];
const publishedAt2 = moment(post2.published_at).format('YYYY-MM-DD HH:mm:ss');
- post2.title.should.eql('Writing posts with Ghost ✍️');
+ post2.title.should.eql('Customizing your brand and design settings');
const res3 = await request
.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&limit=1&filter=${createFilter(publishedAt2, `>`)}`))
@@ -270,7 +270,7 @@ describe('Posts Content API', function () {
should.exist(res3.body.posts[0]);
const post3 = res3.body.posts[0];
- post3.title.should.eql('Welcome to Ghost');
+ post3.title.should.eql('Start here for a quick overview of everything you need to know');
});
it('Can request a single post', async function () {
diff --git a/test/frontend-acceptance/default_routes_spec.js b/test/frontend-acceptance/default_routes_spec.js
index d8b2c29bb5..f734022b95 100644
--- a/test/frontend-acceptance/default_routes_spec.js
+++ b/test/frontend-acceptance/default_routes_spec.js
@@ -122,7 +122,7 @@ describe('Default Frontend routing', function () {
const $ = cheerio.load(res.text);
// NOTE: This is the title from the settings.
- $('title').text().should.equal('Welcome to Ghost');
+ $('title').text().should.equal('Start here for a quick overview of everything you need to know');
$('body.post-template').length.should.equal(1);
$('body.tag-getting-started').length.should.equal(1);
@@ -198,7 +198,7 @@ describe('Default Frontend routing', function () {
const $ = cheerio.load(res.text);
- $('.post-title').text().should.equal('Welcome to Ghost');
+ $('.post-title').text().should.equal('Start here for a quick overview of everything you need to know');
$('.content .post').length.should.equal(1);
$('.powered').text().should.equal(' Published with Ghost');
@@ -245,7 +245,7 @@ describe('Default Frontend routing', function () {
.expect('Cache-Control', testUtils.cacheRules.public)
.expect('Content-Type', 'text/xml; charset=utf-8');
- res.text.should.match(//);
+ res.text.should.match(//);
doEnd(res);
});
@@ -255,7 +255,7 @@ describe('Default Frontend routing', function () {
.expect('Cache-Control', testUtils.cacheRules.public)
.expect('Content-Type', 'text/xml; charset=utf-8');
- res.text.should.match(//);
+ res.text.should.match(//);
doEnd(res);
});
@@ -265,7 +265,7 @@ describe('Default Frontend routing', function () {
.expect('Cache-Control', testUtils.cacheRules.public)
.expect('Content-Type', 'text/xml; charset=utf-8');
- res.text.should.match(//);
+ res.text.should.match(//);
doEnd(res);
});
});
@@ -412,7 +412,7 @@ describe('Default Frontend routing', function () {
.expect('Cache-Control', testUtils.cacheRules.private)
.expect('Content-Type', 'text/xml; charset=utf-8');
- res.text.should.match(//);
+ res.text.should.match(//);
doEnd(res);
});
@@ -422,7 +422,7 @@ describe('Default Frontend routing', function () {
.expect('Cache-Control', testUtils.cacheRules.private)
.expect('Content-Type', 'text/xml; charset=utf-8');
- res.text.should.match(//);
+ res.text.should.match(//);
doEnd(res);
});
diff --git a/test/regression/api/canary/content/posts_spec.js b/test/regression/api/canary/content/posts_spec.js
index fb246f109f..8ccf5ed2b3 100644
--- a/test/regression/api/canary/content/posts_spec.js
+++ b/test/regression/api/canary/content/posts_spec.js
@@ -56,7 +56,7 @@ describe('api/canary/content/posts', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -103,7 +103,7 @@ describe('api/canary/content/posts', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -180,7 +180,7 @@ describe('api/canary/content/posts', function () {
});
it('browse posts with slug filter, should order in slug order', function () {
- return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&filter=slug:[themes,ghostly-kitchen-sink,the-editor]`))
+ return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&filter=slug:[write,ghostly-kitchen-sink,grow]`))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200)
@@ -188,14 +188,14 @@ describe('api/canary/content/posts', function () {
const jsonResponse = res.body;
jsonResponse.posts.should.be.an.Array().with.lengthOf(3);
- jsonResponse.posts[0].slug.should.equal('themes');
+ jsonResponse.posts[0].slug.should.equal('write');
jsonResponse.posts[1].slug.should.equal('ghostly-kitchen-sink');
- jsonResponse.posts[2].slug.should.equal('the-editor');
+ jsonResponse.posts[2].slug.should.equal('grow');
});
});
it('browse posts with slug filter should order taking order parameter into account', function () {
- return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&order=slug%20DESC&filter=slug:[themes,ghostly-kitchen-sink,the-editor]`))
+ return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&order=slug%20DESC&filter=slug:[write,ghostly-kitchen-sink,grow]`))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200)
@@ -203,8 +203,8 @@ describe('api/canary/content/posts', function () {
const jsonResponse = res.body;
jsonResponse.posts.should.be.an.Array().with.lengthOf(3);
- jsonResponse.posts[0].slug.should.equal('themes');
- jsonResponse.posts[1].slug.should.equal('the-editor');
+ jsonResponse.posts[0].slug.should.equal('write');
+ jsonResponse.posts[1].slug.should.equal('grow');
jsonResponse.posts[2].slug.should.equal('ghostly-kitchen-sink');
});
});
@@ -417,7 +417,7 @@ describe('api/canary/content/posts', function () {
jsonResponse.posts[1].slug.should.eql('thou-shalt-be-paid-for');
jsonResponse.posts[2].slug.should.eql('free-to-see');
jsonResponse.posts[3].slug.should.eql('thou-shalt-have-a-taste');
- jsonResponse.posts[8].slug.should.eql('organising-content');
+ jsonResponse.posts[8].slug.should.eql('sell');
jsonResponse.posts[0].html.should.eql('');
jsonResponse.posts[1].html.should.eql('');
diff --git a/test/regression/api/v2/content/pages_spec.js b/test/regression/api/v2/content/pages_spec.js
index 6b6da6ccfb..be07dadfd3 100644
--- a/test/regression/api/v2/content/pages_spec.js
+++ b/test/regression/api/v2/content/pages_spec.js
@@ -39,9 +39,9 @@ describe('api/v2/content/pages', function () {
const jsonResponse = res.body;
should.exist(jsonResponse.pages);
should.exist(jsonResponse.meta);
- jsonResponse.pages.should.have.length(1);
+ jsonResponse.pages.should.have.length(5);
- res.body.pages[0].slug.should.eql(testUtils.DataGenerator.Content.posts[5].slug);
+ res.body.pages[0].slug.should.eql('about');
const urlParts = url.parse(res.body.pages[0].url);
should.exist(urlParts.protocol);
diff --git a/test/regression/api/v2/content/posts_spec.js b/test/regression/api/v2/content/posts_spec.js
index 59e62b7d83..2447d320de 100644
--- a/test/regression/api/v2/content/posts_spec.js
+++ b/test/regression/api/v2/content/posts_spec.js
@@ -58,7 +58,7 @@ describe('api/v2/content/posts', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -367,7 +367,7 @@ describe('api/v2/content/posts', function () {
jsonResponse.posts[1].slug.should.eql('thou-shalt-be-paid-for');
jsonResponse.posts[2].slug.should.eql('free-to-see');
jsonResponse.posts[3].slug.should.eql('thou-shalt-have-a-taste');
- jsonResponse.posts[8].slug.should.eql('organising-content');
+ jsonResponse.posts[8].slug.should.eql('sell');
jsonResponse.posts[0].html.should.eql('');
jsonResponse.posts[1].html.should.eql('');
diff --git a/test/regression/api/v3/content/posts_spec.js b/test/regression/api/v3/content/posts_spec.js
index c597757f98..782b4e1278 100644
--- a/test/regression/api/v3/content/posts_spec.js
+++ b/test/regression/api/v3/content/posts_spec.js
@@ -56,7 +56,7 @@ describe('api/v3/content/posts', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -103,7 +103,7 @@ describe('api/v3/content/posts', function () {
// Default order 'published_at desc' check
jsonResponse.posts[0].slug.should.eql('welcome');
- jsonResponse.posts[6].slug.should.eql('themes');
+ jsonResponse.posts[6].slug.should.eql('integrations');
// check meta response for this test
jsonResponse.meta.pagination.page.should.eql(1);
@@ -180,7 +180,7 @@ describe('api/v3/content/posts', function () {
});
it('browse posts with slug filter, should order in slug order', function () {
- return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&filter=slug:[themes,ghostly-kitchen-sink,the-editor]`))
+ return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&filter=slug:[write,ghostly-kitchen-sink,grow]`))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200)
@@ -188,14 +188,14 @@ describe('api/v3/content/posts', function () {
const jsonResponse = res.body;
jsonResponse.posts.should.be.an.Array().with.lengthOf(3);
- jsonResponse.posts[0].slug.should.equal('themes');
+ jsonResponse.posts[0].slug.should.equal('write');
jsonResponse.posts[1].slug.should.equal('ghostly-kitchen-sink');
- jsonResponse.posts[2].slug.should.equal('the-editor');
+ jsonResponse.posts[2].slug.should.equal('grow');
});
});
it('browse posts with slug filter should order taking order parameter into account', function () {
- return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&order=slug%20DESC&filter=slug:[themes,ghostly-kitchen-sink,the-editor]`))
+ return request.get(localUtils.API.getApiQuery(`posts/?key=${validKey}&order=slug%20DESC&filter=slug:[write,ghostly-kitchen-sink,grow]`))
.expect('Content-Type', /json/)
.expect('Cache-Control', testUtils.cacheRules.private)
.expect(200)
@@ -203,8 +203,8 @@ describe('api/v3/content/posts', function () {
const jsonResponse = res.body;
jsonResponse.posts.should.be.an.Array().with.lengthOf(3);
- jsonResponse.posts[0].slug.should.equal('themes');
- jsonResponse.posts[1].slug.should.equal('the-editor');
+ jsonResponse.posts[0].slug.should.equal('write');
+ jsonResponse.posts[1].slug.should.equal('grow');
jsonResponse.posts[2].slug.should.equal('ghostly-kitchen-sink');
});
});
@@ -416,7 +416,7 @@ describe('api/v3/content/posts', function () {
jsonResponse.posts[1].slug.should.eql('thou-shalt-be-paid-for');
jsonResponse.posts[2].slug.should.eql('free-to-see');
jsonResponse.posts[3].slug.should.eql('thou-shalt-have-a-taste');
- jsonResponse.posts[8].slug.should.eql('organising-content');
+ jsonResponse.posts[8].slug.should.eql('sell');
jsonResponse.posts[0].html.should.eql('');
jsonResponse.posts[1].html.should.eql('');
diff --git a/test/regression/migrations/migration_spec.js b/test/regression/migrations/migration_spec.js
index 84f973d669..7172f329be 100644
--- a/test/regression/migrations/migration_spec.js
+++ b/test/regression/migrations/migration_spec.js
@@ -249,8 +249,8 @@ describe('Database Migration (special functions)', function () {
// Post
should.exist(result.posts);
result.posts.length.should.eql(7);
- result.posts.at(0).get('title').should.eql('Welcome to Ghost');
- result.posts.at(6).get('title').should.eql('Creating a custom theme');
+ result.posts.at(0).get('title').should.eql('Start here for a quick overview of everything you need to know');
+ result.posts.at(6).get('title').should.eql('Setting up apps and custom integrations');
// Tag
should.exist(result.tags);
diff --git a/test/unit/data/schema/fixtures/utils_spec.js b/test/unit/data/schema/fixtures/utils_spec.js
index 5e93464201..0645db6ad5 100644
--- a/test/unit/data/schema/fixtures/utils_spec.js
+++ b/test/unit/data/schema/fixtures/utils_spec.js
@@ -103,11 +103,11 @@ describe('Migration Fixture Utils', function () {
fixtureUtils.addFixturesForModel(fixtures.models[4]).then(function (result) {
should.exist(result);
result.should.be.an.Object();
- result.should.have.property('expected', 7);
- result.should.have.property('done', 7);
+ result.should.have.property('expected', 11);
+ result.should.have.property('done', 11);
- postOneStub.callCount.should.eql(7);
- postAddStub.callCount.should.eql(7);
+ postOneStub.callCount.should.eql(11);
+ postAddStub.callCount.should.eql(11);
done();
}).catch(done);
@@ -120,10 +120,10 @@ describe('Migration Fixture Utils', function () {
fixtureUtils.addFixturesForModel(fixtures.models[4]).then(function (result) {
should.exist(result);
result.should.be.an.Object();
- result.should.have.property('expected', 7);
+ result.should.have.property('expected', 11);
result.should.have.property('done', 0);
- postOneStub.callCount.should.eql(7);
+ postOneStub.callCount.should.eql(11);
postAddStub.callCount.should.eql(0);
done();
diff --git a/test/unit/data/schema/integrity_spec.js b/test/unit/data/schema/integrity_spec.js
index d507d5ef31..9a2d5813c8 100644
--- a/test/unit/data/schema/integrity_spec.js
+++ b/test/unit/data/schema/integrity_spec.js
@@ -33,7 +33,7 @@ const defaultSettings = require('../../../../core/server/data/schema/default-set
describe('DB version integrity', function () {
// Only these variables should need updating
const currentSchemaHash = '559cdbb49a7eeb5758caf0c6e3bf790d';
- const currentFixturesHash = '5f6f69931811c407dff01da9ef9667f4';
+ const currentFixturesHash = '05a291a44821aa340a91796b4c101575';
const currentSettingsHash = '7ac732b994a5bb1565f88c8a84872964';
const currentRoutesHash = '3d180d52c663d173a6be791ef411ed01';