πŸ‘» The #1 headless Node.js CMS for professional publishing

Overview

Ghost

Ghost.org | Features | Showcase | Forum | Docs | Contributing | Twitter

Downloads Latest release Build status Contributors

Love open source? We're hiring Node.js Engineers to work on Ghost full-time

 

Fiercely independent, professional publishing. Ghost is the most popular open source, headless Node.js CMS which already works with all the tools you know and love.

Ghost(Pro)

The easiest way to get a production instance deployed is with our official Ghost(Pro) managed service. It takes about 2 minutes to launch a new site with worldwide CDN, backups, security and maintenance all done for you.

For most people this ends up being the best value option cause of how much time it saves β€” and 100% of revenue goes to the Ghost Foundation; funding the maintenance and further development of the project itself. So you’ll be supporting open source software and getting a great service!

If you prefer to run on your own infrastructure, we also offer official 1-off installs and managed support and maintenance plans via Ghost(Valet) - which can save a substantial amount of developer time and resources.

 

Quickstart Install

If you want to run your own instance of Ghost, in most cases the best way is to use our CLI tool

npm install ghost-cli -g

 

Then, if installing locally add the local flag to get up and running in under a minute - Local install docs

ghost install local

 

or on a server run the full install, including automatic SSL setup using LetsEncrypt - Production install docs

ghost install

 

Check out our official documentation for more information about our recommended hosting stack & properly upgrading Ghost, plus everything you need to develop your own Ghost themes or work with our API.

Contributors & Advanced Developers

For anyone wishing to contribute to Ghost or to hack/customise core files we recommend following our full development setup guides: Contributor Guide | Developer Setup | Admin Client Dev Guide

 

Ghost Sponsors

We'd like to extend big thanks to our sponsors and partners who make Ghost possible. If you're interested in sponsoring Ghost and supporting the project, please check out our profile on GitHub Sponsors ❀️

DigitalOcean | Cloudflare

 

Getting Help

You can find answers to a huge variety of questions, along with a large community of helpful developers over on the Ghost forum - replies are generally very quick. Ghost(Pro) customers also have access to 24/7 email support.

To stay up to date with all the latest news and product updates, make sure you subscribe to our blog β€” or you can always follow us on Twitter, if you prefer your updates bite-sized and facetious. 🎷 🐒

 

Copyright & License

Copyright (c) 2013-2021 Ghost Foundation - Released under the MIT license. Ghost and the Ghost Logo are trademarks of Ghost Foundation Ltd. Please see our trademark policy for info on acceptable usage.

Comments
  • [Discussion] The future of Ghost's admin UI

    [Discussion] The future of Ghost's admin UI

    There has been much discussion, originally starting here: #951, and most recently in IRC around the future of Ghost's admin UI and the frameworks and tools that it should use.

    This discussion is driven by a number of problems that are present in the existing implementation. Any discussion around solutions needs to carefully to consider all the problems that we face in the admin:

    1. The admin is halfway between a one-page app, and a multi-page app, resulting in confusion between what goes where, and code split between the client and the server.
    2. The confusion and disarray has lead to really poor mobile support
    3. A complete lack of data binding, leading to code like this (see #550)
    4. No memory management for views (views are never destroyed) (see #951)
    5. Views are doing transitions (animations) manually (see #951)
    6. Really ugly routing (see #951)
    7. Most of our stuff is rendered client side, but is this bad? interesting article
    8. Our code is really really fragile. It's easy to break saving, or uploading, or something else critical.

    Discussion point 1: What other problems does the admin suffer from? Can you help us better quantify any of these problems?

    It would be great to develop a set of principles / statements that need to be true for any new solution like:

    • Data-binding is handled automatically.
    • Sub-page routing is easy

    Do you have examples of bits of the admin UI that you think are particularly dire? Are their problems you anticipate we might have if we moved from Backbone? Etc..

    Discussion point 2: What is the best structure for a complex client side app like this?

    This sort of depends on the tool used to build it, but also has implications for choosing a tool.

    Is the Ghost admin a single page app, or a collection of single page apps? If you take the dashboard into consideration, I believe that alone is a single page app. The editor is probably the same.

    Do you have ideas on how to structure the admin UI, and how to ensure it works as a whole?

    Discussion point 3: Is backbone the best framework for the job?

    There are many other potential tools we could use, and there are a few main solutions that we consider to be on the table:

    1. Improving the current backbonejs implementation by adding more underlying structure and using additional tools like marionette and rendr
    2. Switching to emberjs
    3. Switching to angular
    4. Something else entirely?

    Do you have some relevant experience with one of these solutions that you can tell us about? Are you able to put together a code example or demo that shows what it might look like, or specifically how a problem is solved?

    Do you have time to implement a more complete demo / example of one of the key features, like the editor, or the post-settings menu?

    Please note:

    Discussions on topics like these can be hard to keep objective, so I'm going to lay out some ground rules. Comments on this issue should contribute something of real value to one of the above discussion points:

    • experience or insight that is relevant to one of the discussion points
    • an interesting article providing insight on how other people have solved
    • a demo or code example showing how a tool could solve a relevant problem

    Please do not post subjective comments suggesting which is your preferred framework, and although we all know the hamster IS a valid reason to choose ember, please keep those sorts of comments to IRC (please)! I have the power to delete comments, and for this thread, I may make use of it without warning :smiling_imp:

    Next steps:

    This is a call to action for our community, a place to come to put your thoughts, ideas, examples and other contributions. We will then use one of the public development meetings to discuss this further and come up with a decision. I propose that we aim for the meeting on Tuesday 25th February.

    update: moved back from 18th to 25th

    opened by ErisDS 129
  • 502 on image upload, but works fine with `ghost run`

    502 on image upload, but works fine with `ghost run`

    I'm having a similar issue as #3827 and the post on the forum here.

    I just updated to 2.31.1 and now whenever I upload an image I get a 502 error. I'm using a DO droplet.

    I tried debugging with ghost run but then it works. However, when I go back to ghost start it gives me 502s again.

    Technical details:

    • Ghost Version: 2.31.1
    • Node Version: 10.16.3
    bug 
    opened by ekerstein 126
  • [Discussion] Solving Search in Ghost?

    [Discussion] Solving Search in Ghost?

    The issue to add Search to the Posts API, is literally the oldest open issue in this repository. It’s a specialist subject, so we’ve always hoped someone with specialist knowledge would come forward to help us solve it, but unfortunately that hasn’t happened.

    To try to increase visibility of the problem we set up a page advertising contributor roles - detailing that we were looking for someone to help solve adding search to Ghost. That didn’t work either :(

    Unfortunately, adding search is a particularly complex challenge. This is another attempt to try to get engagement from the wider OSS community on how to do this - we’d really appreciate the opinions and input of anyone who knows their search-fu.


    Use cases

    There are two key use cases for search inside of Ghost itself - one being in the admin panel to find a post, tag, user or perhaps even a setting that you want to change. This would make a significant improvement to the usability the admin interface.

    The other is adding search to the frontend of a blog, so that it becomes easier to find content. The main things that need to be searchable are post titles and content, tag names and description, user names, and probably meta titles and descriptions for the different resources. There are plenty of use cases where other things would also need to be searchable, so this will need to be extensible, but these are the key fields.

    Approaches

    The best way to make both of these use cases possible, as well as making the search feature available to any apps or other extensions of Ghost in future, is to make it available through the API.

    There are generally two approaches to solving search that would work in Ghost that I am aware of - the first being to use the FTS features of SQL and the second being to use a third party search tool of some description.

    The upside to FTS is that, if we get it working well, it could work for all Ghost installs without any need to install additional (and likely complex) dependencies. The downside is that getting FTS to work for all three of sqlite, MySQL and PG is a sizeable challenge & the status of FTS in knex is unknown - but perhaps it can be done as a bookshelf/knex plugin, in a way that will benefit the wider community as well?

    The upside to using a 3rd party tool, is that there are many modern and advanced systems that we could leverage to make an exceptional search feature. The downside is that most of them require additional complex dependencies* to be installed, which mean they aren’t viable options for Ghost core.

    One of the tools that has been recommended is lunr.js, and there is a plugin for Ghost themes which combines lunr & the RSS feed to make search possible on the frontend. Supposedly lunr also works in node, not just the browser, but I’ve not found much information about it.

    Other tools that are popular for search include lucene and elasticsearch and there are also numerous modules for node built on top of leveldb and redis databases. There are likely solutions out there that I haven’t heard about, so I’d be interested to hear ideas from others.

    * complex dependencies includes binaries or external services - Ghost is currently installable on almost any platform without too much fiddling with compilers etc, and we want to keep it that way!

    Moving forward

    The ideal solution, in my mind, looks something like:

    • Have a rudimentary version of search built into Ghost via the API - using FTS or something else - that will work for 90% of blogs (i.e. relatively small amounts of content).
    • Implement this version of search to be easily extensible, so that it’s very easy to create an app that replaces the search with something more heavy-duty like elastic search or lucene, to support larger blogs.

    The immediate future

    As part of Zelda, we want to introduce a search bar to the admin interface which provides auto-complete style results for posts, tags and users. This should be possible using our existing API, some minor modifications (to allow us to fetch certain fields) and Ember. It’s not ideal, but I think something incredibly rudimentary is better than nothing at all! This will be spec’d in a separate issue.

    Continuing this discussion

    I’m really, really looking for the community to get involved and share their ideas here. This is a relatively specialist subject and I know there are tonnes of developers out there that have a great deal more experience implementing search than I do.

    I’d like to hear thoughts, ideas and experiences on FTS - will we be able to make it work for all 3 databases without having to write too much custom code? Could a bookshelf plugin work? Is it an absolute nightmare not worth pursuing?

    What about lunr? Is it a viable server-side option? Does it have too many requirements or not work for large data sets, or is it the perfect basic option provided it can easily be overridden with elastic search or something else?

    Is there another solution that isn’t mentioned here? Remember we can’t have leveldb or redis or other complex dependencies in core and it has to work across sqlite3, mysql and postgres.

    And what about the API? What would a good search API look like? Who out there has a great RESTful search API that we should take inspiration from? If you know someone you think could answer any of these questions, please link them here and ask them to get involved!

    Thanks :)

    server / core help wanted needs info 
    opened by ErisDS 99
  • [i18n] Translatable Ghost's frontend: Themes, dates, pagination, subscribe forms

    [i18n] Translatable Ghost's frontend: Themes, dates, pagination, subscribe forms

    [i18n] Translatable Ghost's frontend: Themes, dates, pagination, subscribe forms

    no issue

    • (note: this Ghost commit is completed by a Casper commit: "[i18n] Translatable Casper default theme")

    • complete automatic translation of Ghost's frontend for site visitors (themes, etc.), to quickly deploy a site in a non-English language

    • when the translation files are in place (Spanish full frontend now available for a start), frontend language is switched by just changing the default English locale "en" (e.g.: currentLocale = 'es',) in file core/server/i18n.js; this could be done in settings instead of file in future enhancements

    • the corresponding translation file (en.json, es.json...) should be at core/server/translations/en.json, etc., or with later improvements probably at content/themes/mytheme/assets/translations/mytheme_en.json, etc.

    • all 29 frontend text strings (theme, pagination, subscribe email forms) included in translatable {{t}} handlebars helpers, created like already existing handlebars helpers, etc. in files core/server/helpers/index.js and core/server/helpers/t.js

    • easily readable original English text in templates, for very simple translation

    • translatable {{t}} handlebars helpers for templates of the frontend, themes, and apps

    • frontend: .hbs templates in core/server; themes: in content/themes; apps: in content/apps

    • usage examples, in .hbs templates:

      {{t "frontend" "Older Posts"}}
      {{t "mytheme" "Get the latest posts delivered right to your inbox"}}
      {{{t "mytheme" "Proudly published with {ghostLink}" ghostLink="<a href=\"https://ghost.org\">Ghost</a>"}}}
    
    • and in .json translation files, for example for Spanish:
      "frontend": {
          "Older Posts": "ArtΓ­culos Anteriores"
      }
    
      "mytheme": {
          "Get the latest posts delivered right to your inbox": "Recibe los ΓΊltimos artΓ­culos directamente en tu buzΓ³n",
          "Proudly published with {ghostLink}": "Publicado con {ghostLink}"
      }
    
    • comprehensively tested and fully working, with minimum and careful code changes, using Ghost's standard methods, and maintaining the original behavior of the default English version
    • dates with automatically translatable month names via moment.locale() in file core/server/helpers/date.js, since Ghost was already using Moment.js, which currently includes a large number of languages for Node.js without need for additional files; see: http://momentjs.com/docs/#/i18n/ https://github.com/moment/moment/tree/develop/locale
    • current English text strings for common frontend and themes now without modification at the end of already existing file core/server/translations/en.json
    • added file core/server/translations/es.json with Spanish translations for all frontend/theme text strings for site visitors; the backend for admins is still in English
    • core/server/helpers/tpl/pagination.hbs (outside of themes but used by them), with also now automatically translatable pagination
    • the subscribe email forms that are now translatable are those available by enabling the Subscribers feature in Labs settings; see .hbs and .js files in core/server/apps/subscribers, core/server/helpers, and the theme
    • core/server/helpers/plural.js is now ready for flexible translations with replacement
    • compatibility with both old themes and i18n-capable themes
    • locale (e.g. "en") now exported from core/server/i18n.js to make it available for other files when needed, using the Ghost standard core/server/helpers/proxy.js; now locale used in this way in two files, core/server/helpers/index.js and core/server/helpers/date.js
    • best two next enhancements would be language selection in settings instead of file, and using Transifex for volunteer automated translations of the *.json language files instead of editing them by hand; see: https://docs.transifex.com/projects/updating-content https://docs.transifex.com/formats/json
    • translatable themes are also a necessary basis for future enhancements such as multi-language sites with content in several languages instead of one non-English language
    opened by juan-g 93
  • ES6 migrations

    ES6 migrations

    This is something ~I plan on working on in the middle of May~ a bunch of people are helping out on! πŸ˜„

    • var -> let / const
    • _.includes(array) -> array.includes (dropping v4 support at the end of April makes this possible)
    • _.each(array) -> array.forEach
    • _.isArray(array) -> Array.isArray(array) - Only if it removes the necessity of requiring lodash in a specific file
    • _.isEmpty(array) -> array.length === 0 (or !array.length)
    • Remove other lodash dependencies as needed on a file-specific basis (the goal isn't to purge lodash, it's to reduce unnecessary requires of the large library)
    • remove usage of var self = this (arrow functions instead)
    • Use defaults (I'm not sure if this is applicable) (i.e. (a = 2, b = 2) => a + b)
    • Use template literals when possible

    Checklist:

    • [ ] Arrow functions do not replace named functions
    • [ ] var -> const / let
    • [ ] Array.(includes / each / isEmpty / isArray) lodash usage minimized
    • [ ] Template literals
    • [ ] Import specific lodash modules instead of entire library
    server / core help wanted 
    opened by vikaspotluri123 57
  • Proposal: expose Ghost as reusable express middleware

    Proposal: expose Ghost as reusable express middleware

    It would be cool if Ghost could be installed as an npm module, and then used as middleware in any express app. So you could do something like:

    var express = require("express");
    var ghost = require("ghost");
    
    var app = express();
    
    app.get('/', function(req, res) {
      res.send('hello world');
    });
    
    var blog = ghost({
        contentDirectory: "./ghost-blog-content"
    });
    
    app.use(blog.middleware({
        urlRoot: "/blog"
    }));
    
    app.listen(3000);
    

    Notably both the content directory, and the url it is served from are configurable here. It could also be interesting to experiment with allowing the front-end, admin interface and public API to all be served from separate custom locations.

    This would allow all sorts of possibilities such as having multiple Ghost blogs in the same server, and embedding ghost as part of a larger CMS product... Obviously this would need to be in addition to it working standalone, but I don't think that would be too difficult to manage (the standalone version could just be a thin wrapper around the middleware version).

    Thoughts?

    server / core 
    opened by nicoburns 56
  • Run bcrypt in the client and avoid sending the password to the server

    Run bcrypt in the client and avoid sending the password to the server

    The client should never need to send the password to the server, it should be processed (bcrypt'ed) on the client side and send the hash+salt over the wire.

    opened by chiiph 51
  • [Investigation] Image Processing & Manipulation

    [Investigation] Image Processing & Manipulation

    This issue replaces (at least for now) issues #1688, #1734, and #4333 as the one true place to discuss all of our image processing needs in Ghost, and the possible solutions.

    Please note that this issue is not about storing or managing uploaded images, only about processing them on the way to the server ;)


    Image Processing Features

    When it comes to uploading images in Ghost, there are a few issues we need to be able to resolve:

    • cropping an image to a square (see #4333 for full details)
    • removing exif orientation data (see #1688 for full details)
    • simple 90Β° rotations (so that we get the right orientation of an image)
    • optimising an image for display (resizing enormous digital camera photos to a sensible file and display size see #1734)
    • generating different sizes of an uploaded image for use in different situations (see Multiple image sizes below for more detail).

    Multiple image sizes

    There are a few ideas for Ghost features that have been floating around forever that would require us to be able to generate multiple sizes of any one image:

    • serving different sized images to different devices, so that a blog is more optmised for mobile
    • providing themes various image sizes to display in different places (i.e. featured image might be small on the index, and a huge cover image on the post page) which would be accessible by doing something like `{{image size="small"}}
    • allowing themes or apps to define the image sizes they use (and Ghost generating them)
    • any sort of image management app would need a thumbnail

    The current state of Image Processing

    Ghost doesn't currently have any form of image processing built in because we haven't yet found a good solution for doing this. Pretty much all node libraries for image processing have imagemagick as a dependency - and that is not a viable solution for Ghost due it it being a c++ program that's ridiculously hard to install. This leaves us with a few alternative options:

    1. Client - Do the processing on the client side
    2. PureJS - Find a pure JS module for image processing
    3. Compiler - Compile imagemagick using something like emscripten
    4. node-pre-gyp - Create or change an existing node module which wraps imagemagick to use node-pre-gyp which is the same thing we use to install sqlite3
    5. API - Use a 3rd party API for image processing
    6. Other Some other solution we haven't thought of yet.

    Several of these solutions have been discussed or covered in the comments on #1688 and #1734, so they are worth a read ;)

    What we know so far

    1. Client - it may be possible to do simple cropping or resizing using the canvas element and/or File API, but this won't work for any sort of regeneration of sizes, so it won't present a full solution. JavaScript-Load-Image (mentioned here is probably worth looking into though).
    2. PureJS - lwip is the only one I knew of, mentioned in #1734, but it turns out even that is actually largely written in C/C++! Is there really not a single PureJS one out there?! This needs investigating.
    3. Compilers - there was quite an extensive discussion on modules that we could potentially compile into JS and how on https://github.com/TryGhost/Ghost/issues/1688#issuecomment-30776652, this is worth further investigation as we might be a few small steps from a solution here.
    4. node-pre-gyp - if we could identify one of the imagemagick wrapper projects which has the features we need and might be active and willing to accept a PR this might be a viable option. node-pre-gyp has taken pretty much all of the pain out of sqlite3 installs. Still, as this is nowhere near as important a dependency as sqlite, I wonder if it will resolve the issue quite enough to be worth the problems some people will still have.
    5. API - there are a few that have been mentioned although I can't find the references now. Worth investigating, but this is likely to require keys and other complexities.
    6. Other - anyone got any bright ideas?

    In summary, there's quite a bit of research and investigation to be done to come up with a couple of potential solutions for image processing in Ghost, and weigh up their pros and cons. I don't think there is going to be an obvious winner, but we need to gather together a clear picture of what's available to us so we can make a decision. The key thing is that we only* need crop, rotate, resize, exif modification & some optimisation tools - we aren't trying to detect faces or anything!

    Anyone and everyone is welcome to jump in on this, with any solution they can come up with - I'm not looking for one person to do all the research but rather for people to volunteer their suggestions.

    * I know I know only... haha

    server / core api 
    opened by ErisDS 49
  • Worker initialization failure: EMFILE

    Worker initialization failure: EMFILE

    Context

    Every 2 weeks or so my Ghost website (hosted on a Digital Ocean droplet) crashes with this error message:

    [2020-12-27 05:30:19] ERROR
    
    CODE: ERR_WORKER_INIT_FAILED
    MESSAGE: Worker initialization failure: EMFILE
    
    Error [ERR_WORKER_INIT_FAILED]: Worker initialization failure: EMFILE
        at Worker.[kOnExit] (internal/worker.js:229:26)
        at Worker.<computed>.onexit (internal/worker.js:165:20)
    
    [2020-12-27 05:30:19] INFO Worker for job "email-analytics-fetch-latest" exited with code 0
    

    Reproduction scenario

    A possible scenario confirming the issue described in this comment below.

    Environment

    Most cases reported come from: Ghost Version: 3.41.2 Node Version: 12.18.0 Server OS: Ubuntu 18.04 Database: mysql Ver 14.14 Distrib 5.7.32

    bug server / core p2:major 
    opened by kprimice 43
  • Login Takes Too Much Time.

    Login Takes Too Much Time.

    When I log in (or sign up) on my Ghost installation, it takes up to three minutes until the page reloads and I'm logged in.

    I use Ghost on my Raspberry Pi (not the most powerful device, I know) and I don't think this should last that long.

    opened by lfuelling 43
  • Wordpress Export to Ghost initial version

    Wordpress Export to Ghost initial version

    One feature that everyone is clamouring at our heels for is the ability to move their data from an existing WordPress blog.

    We have a shiny import feature, which needs a few tweaks to prevent duplication & to make sure tags work, but otherwise is working.

    We should be able to write a plugin for WP which exports the data we support in exactly the format we need to use with our importer. This should provide the option to choose a single user to export, and then export all posts, tags, and any settings which are useful to us.

    It would be great if the plugin also provided instructions on how to use the exported file with Ghost.

    This is the initial version, because long term we'd like to provide this as a plugin for Ghost which reads the WXR format, rather than a plugin for WP, but we don't have all the pieces in place needed for that sort of plugin just yet.

    opened by ErisDS 43
  • Update metascraper to v5.32.4

    Update metascraper to v5.32.4

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | metascraper (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-author (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-description (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-image (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-logo (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-logo-favicon (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-publisher (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-title (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence | | metascraper-url (source) | 5.32.3 -> 5.32.4 | age | adoption | passing | confidence |


    Release Notes

    microlinkhq/metascraper (metascraper)

    v5.32.4

    Compare Source

    Bug Fixes
    • build: install dependencies for contributors (7e0dd8b)
    microlinkhq/metascraper (metascraper-description)

    v5.32.4

    Compare Source

    Note: Version bump only for package metascraper-description

    microlinkhq/metascraper (metascraper-image)

    v5.32.4

    Compare Source

    Note: Version bump only for package metascraper-image

    microlinkhq/metascraper (metascraper-logo)

    v5.32.4

    Compare Source

    Note: Version bump only for package metascraper-logo

    microlinkhq/metascraper (metascraper-logo-favicon)

    v5.32.4

    Compare Source

    Note: Version bump only for package metascraper-logo-favicon

    microlinkhq/metascraper (metascraper-publisher)

    v5.32.4

    Compare Source

    Note: Version bump only for package metascraper-publisher


    Configuration

    πŸ“… Schedule: Branch creation - "every weekday" (UTC), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    β™» Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    πŸ”• Ignore: Close this PR and you won't be reminded about these updates again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 2
  • Autocorrect, autopunctuation, and autocapitalization not working on iOS Safari

    Autocorrect, autopunctuation, and autocapitalization not working on iOS Safari

    Issue Summary

    The features of autocorrect, autopunctuation, and autocapitalization are not working on iOS.

    I took a video recording of the behavior.

    View recording

    https://user-images.githubusercontent.com/778111/209568830-c15144b7-37f7-4e80-a817-9827038df5de.MOV

    Steps to Reproduce

    1. Install Ghost
    2. Login as an admin
    3. Create a post
    4. In the post body notice the first character is capitalized, but no other characters get capitalized
    5. Notice that entering two spaces does not result in a period followed by a space
    6. Notice that misspelled words do not result in a prompt for the correct spelling

    Ghost Version

    5.26.2

    Node.js Version

    16.19.0

    How did you install Ghost?

    Docker on Linux

    Database type

    SQLite3

    Browser & OS version

    iOS 15

    Relevant log / error output

    No response

    Code of Conduct

    • [X] I agree to be friendly and polite to people in this repository
    needs triage 
    opened by josephdpurcell 1
  • Improve error message for YouTube videos that disabled embedding

    Improve error message for YouTube videos that disabled embedding

    Issue Summary

    EDIT: I've figured out that this specific YouTube doesn't allow embedding. Maybe you could improve the error message shown to the user if you get the Unauthorized message (see below) so this causes less confusion. I have also updated the issue title to reflect this. I'm leaving the following text here as was to leave the context.


    In general, YouTube embedding works. But this specific returns an error: https://www.youtube.com/watch?v=5f-JlzBuUUU.

    CleanShot 2022-12-25 at 20 10 24@2x

    The request is the following:

    https://cassandradispatch.org/ghost/api/admin/oembed/?url=https://www.youtube.com/watch?v=5f-JlzBuUUU&type=embed
    

    The error response is the following:

    {
    	"errors": [
    		{
    			"message": "Internal server error, cannot read oembed.",
    			"context": "invalid json response body at https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D5f-JlzBuUUU reason: Unexpected token U in JSON at position 0",
    			"type": "InternalServerError",
    			"details": null,
    			"property": null,
    			"help": null,
    			"code": null,
    			"id": "e01223d0-8487-11ed-94c3-8df7a8a46270",
    			"ghostErrorCode": null
    		}
    	]
    }
    

    This is becaue the request https://www.youtube.com/oembed?format=json&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D5f-JlzBuUUU

    Returns Unauthorized as the response body.

    Steps to Reproduce

    1. Create a new post (or edit an existing one)
    2. Click the "plus" sign to add a new bloc and choose "YouTube"
    3. Paste this URL: https://www.youtube.com/watch?v=5f-JlzBuUUU
    4. See the error

    Ghost Version

    5.26.3

    Node.js Version

    16.18.1

    How did you install Ghost?

    Hetzner, Ubuntu 22.04.1

    Database type

    MySQL 8

    Browser & OS version

    No response

    Code of Conduct

    • [X] I agree to be friendly and polite to people in this repository
    needs triage 
    opened by shafy 0
  • Return no tiers in GET content tiers API

    Return no tiers in GET content tiers API

    Fixed GET content tiers api, now returns no tiers if paid membership is not setup.

    • [x] There's a clear use-case for this code change, explained below
    • [x] Commit message has a short title & references relevant issues
    • [x] The build will pass (run yarn test:all and yarn lint)

    This resolves the #15759 issue, where we shouldn't return any tiers in GET api/content/tiers if paid membership is not setup by owner.

    @ErisDS I'm new to this repo, I've very little to no context of your business to code terminologies.

    1. I've used the boolean key if stripe is connected to check if paid membership is enabled or not, let me know if it's correct or needs changes.
    2. I'm looking forward to contribute more to the project and any coding style or architectural docs would be really helpful to know the context and implementation of the features.
    opened by farhan787 0
  • Time to read for Persian articles not processed

    Time to read for Persian articles not processed

    Issue Summary

    I am using Ghost in the Persian language for my blog. When I wrote the article, no matter how many characters it contained (1500 words), the time to read for that was 1 min!

    Steps to Reproduce

    adding a blog in Persian language (1500 words) clicking on the preview button the written time for reading this article is 1 min!

    Ghost Version

    5.26.3

    Node.js Version

    16

    How did you install Ghost?

    by ghost cli

    Database type

    MySQL 8

    Browser & OS version

    No response

    Relevant log / error output

    No response

    Code of Conduct

    • [X] I agree to be friendly and polite to people in this repository
    needs triage 
    opened by Savy97 0
  • Last-modified response header is not present

    Last-modified response header is not present

    Issue Summary

    Last-modified response header should be set for effective cache validation. The header is currently not set.

    Steps to Reproduce

    Check response header from Ghost for an article. Last-modified header will be absent.

    Ghost Version

    5.24

    Node.js Version

    16

    How did you install Ghost?

    Kubernets

    Database type

    MySQL 8

    Browser & OS version

    Chrome 108 - Macos

    Relevant log / error output

    No response

    Code of Conduct

    • [X] I agree to be friendly and polite to people in this repository
    needs triage 
    opened by adityapatadia 0
Releases(v5.26.4)
  • v5.26.4(Dec 30, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.26.3...v5.26.4

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.26.3(Dec 23, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.26.2...v5.26.3

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.26.2(Dec 20, 2022)

    • πŸ› Fixed meta is missing error with revue imports (#16033) - Hannah Wolfe

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.26.1...v5.26.2

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.26.1(Dec 16, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.26.0...v5.26.1

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.26.0(Dec 16, 2022)

    • ✨ Added Revue Importer (#16012) - Hannah Wolfe
    • ✨ Added html -> mobiledoc conversion to the importer (#16016) - Hannah Wolfe
    • ✨ Added theme docs link to the design settings (#16014) - Sodbileg Gansukh
    • ✨ Added newsletter subscription filtering to members (#16006) - Ronald Langeveld
    • 🎨 Updated Casper to v5.4.4 - Ghost CI
    • πŸ› Fixed invalid email getting saved for members (#16021) - Rishabh Garg
    • πŸ› Fixed archived offers return button not working (#16023) - Simon Backx
    • πŸ› Fixed importing existing member resetting newsletters (#16017) - Simon Backx

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.5...v5.26.0

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.5(Dec 14, 2022)

    • 🎨 Updated Casper to v5.4.2 - Ghost CI
    • πŸ› Fixed slug saving in editor (#16007) - Elena Baidakova
    • πŸ› Handled unknown Mailgun events (#15995) - Simon Backx
    • πŸ› Removed expired offers shown in portal account detail - Rishabh
    • πŸ› Fixed 'Invalid status code: undefined' in members api (#15973) - Simon Backx
    • πŸ› Removed horizontal scroll for long author's name (#15985) - Elena Baidakova

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.4...v5.25.5

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.4(Dec 14, 2022)

    • πŸ› Reverted Sentry to v7.11.1 to fix unhandled promise rejection crashes - @SimonBackx

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.3...v5.25.4

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.3(Dec 9, 2022)

    • πŸ› Fixed free trial applied alongside an offer in checkout (#15975) - Rishabh Garg
    • πŸ› Fixed email header images serving original image size (#15950) - Simon Backx
    • πŸ› Hid the analtyics page for editors - Simon Backx
    • πŸ› Fixed unexpected "unsaved changes" modal when deleting a member - Kevin Ansfield

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.2...v5.25.3

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.2(Dec 7, 2022)

    • πŸ› Fixed broken redemption count for offers (#15954) - Rishabh Garg

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.1...v5.25.2

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.1(Dec 6, 2022)

    • πŸ› Fixed setting delivered_at to null after hard bounce (#15942) - Simon Backx
    • πŸ› Fixed errors of old events from deleted members (#15944) - Simon Backx

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.25.0...v5.25.1

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.25.0(Dec 2, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.24.2...v5.25.0

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.24.2(Nov 28, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.24.1...v5.24.2

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.24.1(Nov 28, 2022)

  • v4.48.9(Nov 28, 2022)

    • πŸ”’ Disabled editable relations by default (see advisory) - Naz

    View the changelog for full details:

    • Ghost - https://github.com/tryghost/ghost/compare/v4.48.8...v4.48.9
    • Admin - https://github.com/tryghost/admin/compare/v4.48.8...v4.48.9

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.24.0(Nov 25, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.23.0...v5.24.0

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.23.0(Nov 18, 2022)

    • ✨ Added specific newsletter support for bulk unsubscribes (#15742) - Ronald Langeveld
    • 🎨 Updated Casper to v5.4.1 - Ghost CI
    • πŸ› Fixed race condition when sending email (#15829) - Simon Backx
    • πŸ› Fixed amp-youtube being too small (#15826) - Jacob Simon

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.11...v5.23.0

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.11(Nov 15, 2022)

    • πŸ› Fixed error when importing members - Simon Backx

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.10...v5.22.11

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v4.48.8(Nov 15, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details:

    • Ghost - https://github.com/tryghost/ghost/compare/v4.48.7...v4.48.8
    • Admin - https://github.com/tryghost/admin/compare/v4.48.7...v4.48.8

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.10(Nov 11, 2022)

    • 🎨 Updated Casper to v5.4.0 - Ghost CI
    • πŸ› Fixed question marks replacement for some characters in Outlook (#15801) - Simon Backx
    • πŸ› Fixed offer links with an archived tier (#15792) - Simon Backx
    • πŸ› Fixed visible canceled events in conversions tab on analytics page (#15796) - Simon Backx
    • πŸ› Fixed pasting newlines in post titles (#15794) - Simon Backx
    • πŸ› Fixed link click counts for duplicate links (#15789) - Simon Backx
    • πŸ› Fixed ref attribute in email links (#15775) - Simon Backx
    • πŸ› Fixed complimentary_plan member imports - Naz
    • πŸ› Fixed icons size for Outlook (#15772) - Elena Baidakova

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.9...v5.22.10

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.9(Nov 8, 2022)

    • πŸ› Handled deleted Stripe objects in the Stripe Checkout flow - Fabien "egg" O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.8...v5.22.9

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.8(Nov 7, 2022)

    • πŸ› Fixed source tracking using cached value (#15778) - Simon Backx
    • πŸ› Fixed sending feedback on email only posts - Simon Backx

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.7...v5.22.8

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.7(Nov 7, 2022)

    • πŸ› Fixed upgrading Subscriptions to new Tiers - Fabien "egg" O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.6...v5.22.7

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.6(Nov 4, 2022)

    • 🎨 Add comma separation to all numbers in comments - e.baidakova
    • πŸ› Fixed comped subscription duration drop-down sometimes not being visible (#15764) - Kevin Ansfield
    • πŸ› Fixed archiving Tiers (#15761) - Fabien 'egg' O'Carroll
    • πŸ› Add ability to cache comments count endpoint - e.baidakova

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.5...v5.22.6

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.5(Nov 4, 2022)

    • πŸ› Fixed importer importing invalid Tier pricing data - Fabien "egg" O'Carroll
    • πŸ› Fixed archiving Tiers (#15761) - Fabien 'egg' O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.4...v5.22.5

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v4.48.7(Nov 4, 2022)

    This release contains fixes for minor bugs and issues reported by Ghost users.


    View the changelog for full details:

    • Ghost - https://github.com/tryghost/ghost/compare/v4.48.6...v4.48.7
    • Admin - https://github.com/tryghost/admin/compare/v4.48.6...v4.48.7

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.4(Nov 1, 2022)

    • πŸ› Fixed errors with Stripe Checkout (#15749) - Fabien 'egg' O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.3...v5.22.4

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.3(Nov 1, 2022)

    • πŸ› Fixed Portal showing paid Tiers when Stripe not connected - Fabien "egg" O'Carroll
    • πŸ› Fixed upgrading to a paid plan - Fabien "egg" O'Carroll
    • πŸ› Fixed checkout sessions when using Offers - Fabien "egg" O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.2...v5.22.3

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.2(Nov 1, 2022)

    • πŸ› Fixed Tier description not being set (#15741) - Fabien 'egg' O'Carroll

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.1...v5.22.2

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.1(Oct 31, 2022)

    • πŸ› Fixed error preventing admin area being usable by staff users with Contributor role - Kevin Ansfield
    • πŸ› Fixed missing active theme breaks design screen (#15602) - Arjuna Kristophe Sankar

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.22.0...v5.22.1

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
  • v5.22.0(Oct 31, 2022)

    • πŸ› Fixed Tiers importer not correctly mapping price data

    View the changelog for full details: https://github.com/tryghost/ghost/compare/v5.21.0...v5.22.0

    πŸͺ„ Love open source? We're hiring JavaScript Engineers to work on Ghost full-time

    Source code(tar.gz)
    Source code(zip)
Owner
Ghost
Fiercely independent, professional publishing
Ghost
The most powerful headless CMS for Node.js β€” built with GraphQL and React

A scalable platform and CMS to build Node.js applications. schema => ({ GraphQL, AdminUI }) Keystone Next is a preview of the next major release of Ke

KeystoneJS 7.3k Dec 31, 2022
ApostropheCMS is a full-featured, open-source CMS built with Node.js that seeks to empower organizations by combining in-context editing and headless architecture in a full-stack JS environment.

ApostropheCMS ApostropheCMS is a full-featured, open source CMS built with Node.js that seeks to empower organizations by combining in-context editing

Apostrophe Technologies 3.9k Jan 4, 2023
πŸš€ Open source Node.js Headless CMS to easily build customisable APIs

API creation made simple, secure and fast. The most advanced open-source headless CMS to build powerful APIs with no effort. Try live demo Strapi is a

strapi 50.8k Dec 27, 2022
ApostropheCMS is a full-featured, open-source CMS built with Node.js that seeks to empower organizations by combining in-context editing and headless architecture in a full-stack JS environment.

ApostropheCMS ApostropheCMS is a full-featured, open source CMS built with Node.js that seeks to empower organizations by combining in-context editing

Apostrophe Technologies 3.9k Jan 4, 2023
πŸŽ‰ Next Generation API-first CMS for developers. Generate an API-first CMS from a GraphQL schema with offline prototyping and an inline editor

Tipe Next Generation API-first CMS Design your content Shape and design content for any project you and your team are working on. Create your content

Tipe 2.2k Oct 22, 2021
Reaction is an API-first, headless commerce platform built using Node.js, React, GraphQL. Deployed via Docker and Kubernetes.

Reaction Commerce Reaction is a headless commerce platform built using Node.js, React, and GraphQL. It plays nicely with npm, Docker and Kubernetes. G

Reaction Commerce 11.9k Jan 3, 2023
A Node.js CMS written in CoffeeScript, with a user friendly backend

Nodizecms A Node.js CMS written in CoffeeScript, with a user friendly backend Status NodizeCMS is still under heavy development, there's a ton of unim

Nodize CMS 176 Sep 24, 2022
Minimalistic, lean & mean, node.js cms

enduro.js Enduro is minimalistic, lean & mean, node.js cms. See more at enduro.js website Other repositories: Enduro β€’ samples β€’ Enduro admin β€’ enduro

Martin Gottweis 688 Dec 31, 2022
Drag and drop page builder and CMS for React, Vue, Angular, and more

Drag and drop page builder and CMS for React, Vue, Angular, and more Use your code components and the stack of your choice. No more being pestered for

Builder.io 4.3k Jan 9, 2023
The official CMS of OwnStore suite.

This project is part of OwnStore suite. Learn more here: https://ownstore.dev The suite contains the following projects: Website API CMS Doc Apps TWA

OwnStore 15 Nov 12, 2022
We.js, extensible Node.js MVC framework - CLI

We.js ;) We.js is a extensible node.js MVC framework For information and documentation see: http://wejs.org This repository (wejs/we) have the We.js C

We.js 208 Nov 10, 2022
Javascript Content Management System running on Node.js

Cody CMS A Javascript Content Management System running on Node.js We finally took upon the task, we are happy to announce the transition to Express 4

Johan Coppieters 669 Oct 31, 2022
Business class content management for Node.js (plugins, server cluster management, data-driven pages)

PencilBlue A full featured Node.js CMS and blogging platform (plugins, server cluster management, data-driven pages) First and foremost: If at any poi

PencilBlue, LLC. 1.6k Dec 30, 2022
Business class content management for Node.js (plugins, server cluster management, data-driven pages)

PencilBlue A full featured Node.js CMS and blogging platform (plugins, server cluster management, data-driven pages) First and foremost: If at any poi

PencilBlue, LLC. 1.6k Dec 30, 2022
We.js, extensible Node.js MVC framework - CLI

We.js ;) We.js is a extensible node.js MVC framework For information and documentation see: http://wejs.org This repository (wejs/we) have the We.js C

We.js 208 Nov 10, 2022
AdminBro is an admin panel for apps written in node.js

Admin Bro AdminBro is An automatic admin interface which can be plugged into your application. You, as a developer, provide database models (like post

Software Brothers 6.5k Jan 2, 2023
A Node.js Express backend for a Stackoverflow like answering forum, with RESTful endpoints

A Node.js Express backend for a Stackoverflow like answering forum, with RESTful endpoints, written in es6 style with linted and comprehensively unit-tested code. Utilizes a local json database using fs but has full separation of concern to implement anything else.

Dhiman Seal 3 Jan 9, 2022
πŸ‘» The #1 headless Node.js CMS for professional publishing

Ghost.org | Features | Showcase | Forum | Docs | Contributing | Twitter Love open source? We're hiring Node.js Engineers to work on Ghost full-time Th

Ghost 37k Apr 5, 2021
⚑️The Fullstack React Framework β€” built on Next.js

The Fullstack React Framework "Zero-API" Data Layer β€” Built on Next.js β€” Inspired by Ruby on Rails Read the Documentation β€œZero-API” data layer lets y

⚑️Blitz 12.5k Jan 4, 2023
The most powerful headless CMS for Node.js β€” built with GraphQL and React

A scalable platform and CMS to build Node.js applications. schema => ({ GraphQL, AdminUI }) Keystone Next is a preview of the next major release of Ke

KeystoneJS 7.3k Jan 4, 2023