Ghost would have cut-off points with major versions,
allowing core developers to remove old code from the
codebase and evolve the platform to allow it to improve.
No one expects an app written for OSX 10.4 Tiger to work
on OSX 10.8 Mountain Lion.
Oh, hell no. Backwards compatibility is way more important than some shiny new feature. When I upgrade my software, I expect it to work better, not break. If I have a working plugin from 5 years ago, why should I have to fight with some pointless API redesign just to get it to work again?In the real world, people need compatibility more than they need whatever cleanup you're able to do by breaking compatibility. Heck, in many cases you can get both by doing your rewrite but leaving a compatibility layer on top that gives you the compatibility that you need.
I'm so sick of trendy "modern" frameworks like Rails that break compatibility every 5 minutes, and listing breaking compatibility as a major feature is a huge turnoff.
How about focusing on spending the pre-1.0 releases iterating and designing a really good API that will be amenable to backwards compatible extensions, and then sticking to that API and backwards compatible extensions to it for the forseeable future?
The difference between 10.4 and 10.8 is seven years. That doesn't seem like an outrageous amount of time to break compatibility.
Forever? At least the linux kernel has an explicit goal of never breaking userspace. That doesn't mean other parts of userspace don't break themselves, but the linux kernel has as a development goal to never break binary compatibility for userspace.
I think there's some good precedence for that with Firefox who (still?) deliberately broke all their extension compatibilities on every release, and contrary to that Wordpress who've led to a fully automated exploit ecosystem.
#Supporting older versions is a pain. Supporting all features in older versions AND newer versions to work together is an even bigger pain. Example: Wordrpress.
#Compatibility for older version leads to bloated code, with too many legacy variables, too many points of failure. Example: Wordpress.
#Evolution of any software requires that it discards old ideologies and embraces the newer ones. The ones that don't do, tend to drift away from the main goals. Example: Wordpress.
Wordpress was started with the exact same intention as Ghost and yet, what you are left with now is a half-baked unstable CMS, and a half-baked blogging platform that breaks old plugins with each upgrade.
If you want to embrace progress, then you must embrace C.H.A.N.G.E. And this is not just for software.
I want a frozen codebase that only worries about critical security updates.
In the real world, you will break your site by adding new plugins every few months. The site will break. I get a stable codebase and I sit on it.
Development causes bugs! Milestone releases are what I want.
> In the real world, people need compatibility more than they need whatever cleanup you're able to do by breaking compatibility.
Here's the thing: if you're a user that needs compatibility don't upgrade! (not an option with most blogs) If you're always adding new functionality and plugins to your blog, things will break. If your business needs constant new web technology updates, use a real CMS and fix them when they break. They will break, they always break.
I have used plugins that haven't been updated for four years without any issues.
Of course, one way to achieve this is less reliance on add-ons, so you have less API surface to expose. Having a usable WordPress install relies so heavily on add-ons that it's kind of pointless to consider WordPress alone.
Time and time again, rolling software has proven to be more secure than static releases. A plugin from five years ago that hasn't been maintained in that time is probably going to hurt you a lot.
When you have constantly breaking API changes, and then someone has an essential plugin that's unmaintained, then they're a lot more likely to stay with your old, buggy, insecure base package, rather than finding someone who knows how to update their plugin (remember, most users aren't programmers, and most have installed plugins for a reason).
What you do is try to minimize the API surface that plugins have so it's easy to maintain backwards compatibility, and minimize the impact that older plugins can have by keeping them reasonably well isolated.
Unless it just does some simple, or basic thing. In which case, you're still hurt. But in a different way....
The other way around is different, of course, as as a huge number of new APIs have been added since then.
The Ghost admin panel doesn't allow editing themes, the post doesn't have buttons that allow you to quickly format posts, there are no SEO options/plugins, there is no theme editor that allows editing of themes, no sidebars, no multi-user creation, no e-mail to post, etc. Too many features are missing and this is very simple. WordPress is better, there just is no debate on this right now.
Also, we are talking ~37k lines of code, not exactly something you can write in a week or two for $500.
This is a bit of a shameless plug, but I figure it's relevant to this topic. I just put up blog post introducing my new project, Grow (http://about.grow.io/blog/all-i-want-to-do-is-build-a-web-si...). Grow overlaps with Ghost in some ways, but attempts to be a full-fledged, modern file-based CMS and is not designed just for blogs alone. I've been following all the replies in this thread to get a better idea on what people are looking for, and I think I've nailed it.
Basically, the way I've architected Grow is the whole system is file-based: content is stored in Markdown or YAML files, templates are stored as Jinja2 templates, separate from the content.
When you start up a Grow server for development, essentially what amounts to a super lightweight in-memory index is created from the file structure, and that allows your site to be generated (including pages that leverage complicated queries or access content through taxonomies).
This design keeps everything incredibly portable (zero-configuration development AND zero-configuration deployment) – which is one of the values that I hold to be very important. Anyway, the project is still super young (and my blog post is light on technical details, but I'm working on it), so I'm interested in getting any early feedback.
the db is sqlite by default, and its stored in content/ with your themes and other stuff (?)
so you just backup your content directory ;d
My gripe is that it appears tied to SQLite, and I can't use Postgres. Oh well, wasn't planning on using it anyway.
So in theory putting in the correct connection config should allow you to use Postgres.
"optionalDependencies": {
"mysql": "2.0.0-alpha9"
},
And this guide [2] seems to indicate that PG support is possible.[1] https://github.com/TryGhost/Ghost/blob/master/package.json
[2] http://www.howtoinstallghost.com/how-to-install-ghost-on-her...
I think now that you've made your point I may abstract models to the point where the database can be either MariaDB or a bunch of JSON files/SQLite. Its tricky because I build databases for performance and scalability over flexibility.
To give you an idea of what I mean, Wordpress makes me cringe in the way they handle their tags, categories etc. and the sheer amount of SQL queries and joins for a simple front page. I make at most 2 queries for the front page (excluding sidebar, which would be cached), the user session authentication and the articles. I make no queries if I can help it ( Caching in node.js is so fun ). Categories are always in memory, along with user roles, settings etc.
It's really quite glorious having a readily available memory store. I'm getting around ~500 queries per second to my front page in apachebench, which would normally have about 7-10 queries to the database.
Sadly, nowadays thats pretty much everyone. If you want me to care about you (apparently/marketwise you don't), then get your design right. Tip: Design is not looking pretty. Design is this question: Does it work?
Turn off foreign fonts (?) maybe 0.001% of web users do that.
Fonts to display icons reduce HTTP overhead and scale, looking great on retina screens.
There are some very good reasons why you'd want icons in a font. For example, font rendering is well supported by all browsers and very configurable through CSS, and if the default font size is increased for accessibility reasons the icons can also scale.
> Why would you turn off foreign fonts?
Because I don't want foreign fonts. They are usually either just bad (e.g. worse than my OS font) or render badly.
> It's an edge case, 0.0000001%, ....
You are not downwards compatible. It's an edge case because you make it one by deciding on web "standards" by thoughtlessly applying these short-sighted idioms.
Using sprites instead of fonts to support users with foreign fonts disabled means degrading the product for some other users. Building a polyfill means not spending the time improving something else.
Why do you consider "support everyone" to be obviously better than "build a better product for a subset of users"?
I feel like the undending debates around this issue (most often regarding JS) exist because some people on HN look at it through a business angle where #2 can make complete sense, while some others look at it through a Web ideals angle where anything but #1 is heresy.
Edit: To be fair, the Web ideals remark doesn't seem to apply to you. You rather seem to consider than being pretty is way less important than supporting more people. But why? Being pretty has been increasingly important this past decade, and especially so regarding blogs where being pretty is one of the few differentiators.
- Wordpress has become a over-convoluted behemoth, with a needlessly complex structure that is not overly extensible. It is a pain to develop for/with/around.
I think everyone can appreciate the very tangible effect that Wordpress has had on the web. However, it is currently in the rather painful throws of a transition from blogging platform to CMS, and has been for quite some time.
There are number of other reasons:
- You want to avoid PHP.
- You don't need most of the feature bloat that comes along with Wordpress.
- You want to use Markdown.
- You want to try something different.
You say "SO many reasons", but at best you have 4, of which only one seems to hold any weight. Avoiding PHP is not something the average blogger would care about, bloat = features and most normal people like features, trying something different is woolly at best, which leaves wanting to use markdown. Do that many people really want to use markdown?
Are you 100% sure this isn't just an anti thing like anti MS, anti facebook, and now anti wordpress?
So it is down to network effects. Everyone knows Wordpress and the famous five minute install.
Then again, Markdown would be neat to work with, but in the end I'd just rather use html if I need to markup something. And I do like trying new things.
If Ghost is easy to theme and the templates easier to read / build / maintain then that's a big plus for me. I may not want to touch any code on the thing, but I would certainly want to do work on the templates.
In case anyone's looking, this PPA[1] seems to come recommended and has an up-to-date node.
http://blog.argteam.com/coding/hardening-node-js-for-product...
Basically Nginx is used as a reverse proxy to serve requests from a pool of Node.js processes, each with its own internal port. So you would set up the Node.js app to run internally on ports 8080, 8081, 8082, and 8083 for example. (If you have a quad core server this assures that under extreme load each processor can be fully utilized by one single-thread Node.js process). Then Nginx serves requests on port 80 by fetching the response from one of those four internal ports in round robbin fashion.
If one of the processes crashes due to a bug or you want to specifically restart it so that a new code update takes effect in production then Nginx will automatically remove it from the pool while it is down and then add it back when it comes back online. When you are pushing out code updates you can cycle each process one at a time to do a zero downtime deploy.
The other cool thing that you can do with Nginx reverse proxies is use the proxy_cache as a robust cache layer to almost completely remove stress from your blog under high load.
Honestly for a basic personal blog this technique probably isn't really necessary. You could just run it through Forever on port 80 with no Nginx and forget it, but if you expect tons of traffic, or if you want high 99% uptime, or if you just want to have some fun configuring a server then the technique I explained above is how you do it. It takes some fiddling to get Nginx configured properly and that tutorial I linked actually leaves out some details of the upstream server configuration but its pretty easy to figure out from the Nginx documentation.
[1] http://0v.org/installing-ghost-on-ubuntu-nginx-and-mysql/
For example in my fork of Dokku I replaced Heroku buildpacks with plain Dockerfiles to define both a stack and a runtime dependencies — https://github.com/andreypopp/upaas
* [edit] Download link seems to have been fixed.
* Cloned the repo instead and set everything up. Cloning the submodule for the theme didn't work due to some rights issue. Cloned it by hand then.
* Setup was pretty easy otherwise, even though I'm using the development version.
* [edit] Nevermind. You can signup without the mail sender beeing setup, just not recover the password it seems. Notifications per mail are also disabled. Should have read more carefully.
* No direct link to the interface on the blog index (or am I blind?). Have to add /ghost by hand.
* Rest seems pretty nice, though barebone. No comment system, why? The only benefit to static blogs that is left is the online editor.
For all of its flaws, documentation is an area that Microsoft does very well. IMO, many companies and projects would be better served by step-by-step guides.
The following are the commands I used to setup Ghost on Ubuntu Linux 13.04 x64. The only assumption below is that you have git setup already.
# switch to root so you don't have to sudo repeatedly
sudo -i
# Install node (user private install).
cd; mkdir packages; cd packages; wget http://nodejs.org/dist/v0.10.20/node-v0.10.20-linux-x64.tar....; gzip -dc node-v0.10.20-linux-x64.tar.gz | tar xf -
echo 'PATH=~/packages/node-v0.10.20-linux-x64/bin/:$PATH' >> ~/.profile; source ~/.profile
which node
# Install ruby and gems
apt-get install ruby
gem install sass; gem install bourbon
# Install Python
apt-get install python python-virtualenv
easy_install Pygments
# Clone Ghost (assumption: you already have git installed/setup)
git clone git@github.com:TryGhost/Ghost.git
cd Ghost
git submodule update --init
npm install -g grunt-cli
npm install
grunt init
npm start
# Open Ghost
Open a browser to http://localhost:2368/ to view the blog or open http://127.0.0.1:2368/ghost/ to view the admin UI.
1: https://github.com/keeb/Ghost/blob/add-dockerfile/Dockerfile
Path A: Warts and Brew: * Mac OSX 10.9 * latest homebrew
1. brew install npm && brew install node.js
2. gem install bourbon && gem install sass
3. Then: Do the Installation / Setup instructions here:
https://github.com/TryGhost/Ghost/blob/master/CONTRIBUTING.m...... because: you have to install some ruby templates and such .. please note that you should also have done 'gem instal sass' step above, before you do step #3 ..
I found it works quite well if you get through that setup. I'm impressed enough to have been using it as an app for the last day or so .. its got a nice interface. I'd love to have time to hack up more templates.
Plan B: The easy route: vagrant Well, another great use for vagrant. Works very smoothly as well: https://github.com/TryGhost/Ghost-Vagrant
The download link seems to have been fixed so I'll take a look at the packaged version. I reckon it requires nothing more than unpacking and installing the dependencies.
Of course there are installers as well which probably require no user input at all.
From a first glimpse:
Plus: - Good design, simple to use, friendly colors. - MIT license. - Well done support forum.
Minus: - Features should be more clear. - I might be mean but when I read "Just a blogging platform", I automatically read "Just a(nother) blogging platform." - Better replace the laptop+wodden table+moleskine+coffee stock image with something better. Everyone is using that stuff right now. If you want to be different, better look different. - Why the name "Ghost"? Maybe it has some meaning? - Git Link way too hidden.
Good job!
Svbtle and Medium are hosted (and as a result, controlled-by) a 3rd party. You host Ghost yourself, giving you complete control over the platform. I think a better comparison would be probably be to Wordpress.
I'd like to hear a comparison (though happy to throw wordpress in the consideration pool too)
(BLO)Ghost?
I'm speculating wildly here, but maybe because the blogging platform becomes invisible, like a ghost. A similar approach to LaTeX for word processing. And also perhaps because of the writing theme, as in ghost writing.
So either you're confused about the relative performance of Node against the other most popular frameworks, or you dislike all of the most popular frameworks and have your own preference for a webapp that you're failing to mention, and that most people disagree with you on the merits of. Which is it?
When one asks yourself what other people in industry are doing, one would notice that, say, Facebook resorted to translate PHP into C++ and compile it into a static binary, that Google is making huge static binaries (who said Lisp images?!) from the very beginning, and other people are trying, for some not obvious reasons, make a huge blob inside a JVM.
There are a lot of reason and logic behind products like Varnish Cache, which is, basically, a thin layer on top of an OS, the way how such apps, perhaps, should be implemented.
Finally, very clever people at Google have noticed that there are much better ways to create huge static binaries than C++ and now we have Golang, which is, probably, the direction a sane person should look at for making yet another blog engine.)
My bet is that if I search github for a blog app written in go, each one of it will beat in terms of resource utilization and performance any Node-based app, for reasons that authors of nginx or Varnish Cache or Google/Facebook engineers took into account.
So, i
There is no justification of using any VM for an (cache-able) I/O bound apps. Why do they need nginx as a front-end if NodeJs so great?)
Could the whole engine be implemented as a few nginx's modules using another ready modules?)
Oh, sorry, I forgot to close the tag.
Where is the proof of this? Any hard data on customer account numbers or growth?
There are lots of solid VPS providers out there. I don't see why Digital Ocean gets so much hype.
* "Oh, a New Zealand accent. One of us! I hope this is really awesome and I want to try this out already."
* "Oh, he says he was in charge of WordPress interface design for two years. Using WordPress causes me pain. I expect this product to be painful."
Wait, what?
WordPress' backend may be a mess, but it's CMS interface is the only one I've ever trained a non-technical person on that they liked or seemed to be able to use right away. I worked at a marketing/dev shop for years and have probably trained 40-ish non-techy clients (usually small marketing teams of 3-4) on customized CMS installs. WordPress' dashboard was by far the best when it came to power/usability ratio.
People should be wary of custom built CMS UIs, not only because most people have learned a UI like WordPress or Tumblr.
If you think the UI is painful that I don't have a lot of faith in your ability to objectively judge interfaces especially in the context of history.
Sadly, this is too common of a fallacy in judgment, and one that seems most non-fallacious on its face. But whether we want to admit it or not, sometimes output and achievements are highly impacted -- even dependent -- on the organization and institution than the individual. So someone highly successful at Apple retail, for example, may flounder at JCPenney's (http://dealbook.nytimes.com/2012/11/12/a-dose-of-realism-for...).
So it goes both ways. It's wrong to argue that someone who was great at once place will necessarily be great at another. And conversely, someone who's work turned out awful at one place (either by poor management or design-by-committee), may flourish in different circumstances
In the node world, it's easy to find reference code on libraries and modules, but I always fail to find a source of some practices further developed than todo lists. It is not about the code (which as far as I have looked is Ok), but about tying technologies and practices together.
Here, we got a node express backend with handlebars as the templating engine, defined grunt tasks, some unit tests and backbone on the client.
I am really looking forward to keep diving as the project progresses!
By the end of it you might, like me, just continue with your own framework (when you can of course).
JS BINGO!
Sorry, I couldn't resist. I'm something inbetween disgusted and amused by this soup of JS libraries and buzz words. I feel like I'm gonna vomit while laughing.
Here, we got a python flask backend with mustache as the templating engine, defined fabric tasks, some unit tests and backbone on the client. CPU sensitive tasks are handled by Celery or RQ, on Redis or RabbitHQ.
Maybe you would prefer:
Here, we got <Insert your language here> , with no templates, some bash scripts to build the project, no unit tests and a half-assed mess of javascript spaghetti code tied together on the client.
I must ask, if you do build websites, how do you (or if you do):
- Use a framework
- Use templates
- Minify and build assets
- Test your code
It's been many years since we have moved from frameworks that do everything, to small libraries that do one thing and to it well, sometimes opinionated or not. For me, choice is better.
It is always a good pass time to look how people build their projects, compare it on how you are doing it, and decide if you can learn something from that. I might be wasting my time, and your comment was just an opportunity to bash on a language or community. I could not care less, as I have no cards on this game. Just use whatever works for you.
I also have an instance up and running[2] if you want to play with it. Messing it up doesn't matter to me as I will just docker run a new one. Have fun.
Username: nstinemates@gmail.com
Password: demodemodemo
1: https://github.com/keeb/Ghost/blob/add-dockerfile/Dockerfile
2: http://stinemat.es:49429/ghost/
edit: One of you lovely gentle souls decided to change the demo password. Thanks for making me have to `docker stop` then `docker run` a new one and inconveniencing me for all of 2 seconds.
Link updated.
Or if you want a private instance I will make no guarantees about just send me a note. I'll be happy to provide it on a subdomain of your chosing.
things i've noticed so far (.3.0):
- no dash yet
- no view posts by category feature
- no list top 10 most recent posts
- kind of confusing or redundant mvc abstraction
i hacked up a view posts by category and a template swap by hostURL in a few hours but the code is really abstracted. it will probably make sense later when all the features are implemented though.
good:
- easy to install
- love the editor
- love the admin
- templates are handlebars and easy
i've been following this for ~6 months now and am stoked to use it. congrats on your release. can we please have a CMS style feature were we can edit some static pages to go into our blogs! PLZ!
i recommend just copything the casper folder and renaming it. (content/themes/casper)
make your own stylesheet and comment theirs out (it, styles, everything). theirs is screen.css.
you can comment out the ghost included {{body_class}} and {{ghost_foot}} by changing them to {{!body_class}} and {{!ghost_foot}}
after that its just 3 files, default.hbs which is a global template (so its like the html head body tags), and then they insert the body at {{body}}
the body comes from index.hbs or post.hbs, which will be index.hbs: 6 article summaries in a list with a page at the bottom. and post.hbs which will just show 1 post.
the data in the post and index hbs files (handlebars templates) has stuff like {{eachpost}} {{post}} which is all you really have to keep out of those files
Glad to see this, hope it will keep up the expectations.
[0] http://www.kickstarter.com/projects/andrewgodwin/schema-migr...
Thanks for the Git-Annex link - didn't know he ran a campaign on his own after doing it on Kickstarter.
15923 error sqlite3@2.1.16 install: `node build.js` 15923 error `cmd "/c" "node build.js"` failed with 1 15924 error Failed at the sqlite3@2.1.16 install script. 15924 error This is most likely a problem with the sqlite3 package, 15924 error not with npm itself. 15924 error Tell the author that this fails on your system: 15924 error node build.js 15924 error You can get their info via: 15924 error npm owner ls sqlite3 15924 error There is likely additional logging output above. 15925 error System Windows_NT 6.2.9200 15926 error command "C:\\Program Files\\nodejs\\\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "--production" 15927 error cwd C:\Users\Nick\Downloads\ghost-0.3.2 15928 error node -v v0.8.16 15929 error npm -v 1.1.69 15930 error code ELIFECYCLE 15931 verbose exit [ 1, true ]
"We have successfully created the world's first fully functioning blogging platform built entirely with JavaScript."
Really? The world's first entirely JavaScript blogging platform? Google turns up plenty, albeit not quite as polished.
Ghost has many (all?) of the above, and that's relatively rare in any ecosystem (PHP, Ruby, Python, whatever) for a young project. If this project can continue building momentum, then it would truly be unique in general and certainly in the JS ecosystem.
ETA: When I say tricky throwing around labels, I mean one thing can mean one thing to me and something else to you. I guess semantics would be the short word for that.
Are the posts stored in a db or are they generated HTML?
Plain, old, generated HTML works perfectly. Plus it is very easy to host.
If this is something you guys can implement, I would suggest looking at it.
Your hosting will be MUCH simpler, cheaper, more profitable (even though you say you are running a non-profit), general footprint will be smaller, and pages will load quicker.
That's just my $0.02.
I love what I see here, but I can't bring myself to going back to a db-powered blog from Octopress.
The day you guys implement something similar, you will have 1 more user though!
Either way....awesome execution and congrats on everything you guys have done. Love it so far.
> ghost@0.3.2 start /var/www/servers/www..dyndns.org/pages/ghost
> node index
Ghost is running...
Listening on 127.0.0.1:2368
Url configured as: http://my-ghost-blog.com
Ctrl+C to shut down
127.0.0.1:2368 gives me an unable to establish a connection error (btw, I'm ssh-ing into my pi on the lan).
and also 127.0.0.1:2368/ghost where I am meant to access my admin account setup.
Any idea what went wrong?
Because I was ssh-ing into the pi, in the config file, I had to change the localhost address to my pi's address on the lan. Then access it via that lan address with the suggested port.
That's truly sad.
http://en.wikipedia.org/wiki/Mac_OS_X_Tiger
However, Tiger is actually 8 years old. I don't think obsolesence in eight years is too horrible.
One of the nicest things about it (aside from the use of node and express, which is very nice IMHO) is that it's open source so you can start looking through the code to find out.
"you have, in the case of Content that includes computer code, accurately categorized and/or described the type, nature, uses and effects of the materials, whether requested to do so by Ghost Foundation or otherwise"
There's also the combination of reserving the right to take down any content for any reason. That's fine for a free service, but unacceptable for a paid one, particularly one that claims that it needn't give refunds.
Edit: http://www.ghost.org/features/
Looks like markdown+looks stylish. Not sure what else.
http://www.kickstarter.com/projects/johnonolan/ghost-just-a-...
http://brislink.github.io/specter/
I don't think it's out to replace Wordpress like Ghost is trying to do though.
I would expect the editor of Logdown much better to use. It reads Github Flavored Markdown, has code highlighting, drag & drop image upload. And it's an online service, so you don't need to deal with the server stuffs. Much easier to use.
By my understanding node.js is rather low-level to be a good platform for content-driven sites. Is this inaccurate?
Build failed [sqlite3]: 1 npm ERR! weird error 1 npm ERR! not ok code 0