Need help with meteor-blog?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

437 Stars 127 Forks MIT License 522 Commits 43 Opened issues


Gives you a basic, out-of-the-box blog at /blog

Services available


Need anything else?

Contributors list

Meteor Blog

This Meteor package gives you a basic, out-of-the-box blog at

(or where ever).

This blog is very much a work in progress. To help decide what gets added next, vote with your Github issues!

Meteor Icon

Table of Contents



We wanted a way to add a meteor-based blog within an existing project without running another app.

Example App

You can view an example application (without customization) at .

Meteor no longer offers free hosting. There is an example app that you can run yourself.


$ meteor add ryw:blog

And then either:

$ meteor add iron:router


$ meteor add kadira:flow-router kadira:blaze-layout

You will by default get routes for:


These paths are customizable (see below).

requires that
return a user.


  • Medium-style editor
  • Slug-based URLs (editable)
  • Add blog post images (store in database or upload to S3)
  • Add featured, "hero" image for a post
  • Support DISQUS comments
  • Blog post tags and tag view
  • Widget to embed recent posts on another (e.g. home) page
  • Customizable layouts & templates
  • Custom base paths
  • SEO best practices (OpenGraph, Twitter Cards, share buttons, Google+ author attribution)
  • Autosave
  • Pagination
  • Code syntax highlighting
  • Multiple roles (admin/author)
  • Have Public, Private & Draft modes
  • Support for both Iron Router and Flow Router
  • RSS feed


Check out the enhancements tracker


Changes between releases can be found in


You do not need any configuration at all, if you are happy with the defaults. To configure your blog, create a file shared on client/server, probably in



Meteor blog works with both Iron Router and Flow Router. If your app and the blog have conflicting routes, your app will get priority. If you use Flow Router, you must add

to your app, as that is how Meteor blog renders its templates in a Flow Router route.
Custom Base Paths

You can customize the base path for the blog and for the blog admin area.

  basePath: '/myBlog', // '/myBlog', '/myBlog/my-post', '/myBlog/tag/whatever', etc.
  adminBasePath: '/myBlogAdmin'

If you set the

, blog posts will appear at the root path of your app (e.g. This means that the blog index page will be your home page, unless you override the route. This also means that Meteor Blog can function as a crude CMS. For more CMS-like features, create a Github issue!

If you need a

-like way to generate URLs, you can use
for either router (e.g.
{{blogPathFor 'blogIndex'}}


By default, any logged-in user can administer the blog. To ensure that only select users can edit the blog, the package supports two roles:

  • adminRole
    - Can create, and modify or delete any post.
  • authorRole
    - Can create, and modify or delete only my own posts.

In addition, if using groups from the alanning:roles package, set the associated group using

  • adminGroup
    - Group associated with
  • authorGroup
    - Group associated with

To enable either or both roles, specify values in the blog config:

  adminRole: 'blogAdmin',
  authorRole: 'blogAuthor'

Then, you need to give blog users that role. Currently, you're on your own to add these roles somehow:

  • Add these directly to admin users in the database (
    "roles": ["blogAdmin"]
    ), or
  • Roll your own admin page using the methods provided by meteor-roles, or
  • Use an accounts admin package like accounts-admin-ui-bootstrap-3.

Admin Templates

The admin templates are designed for use with Bootstrap. To use the admin area, you should add the meteor

$ meteor add mrt:bootstrap-3

Custom Templates

The admin templates are designed for use with Bootstrap. However, the front-end is bare markup, ready to by styled, and does not depend on any CSS framework at all. If the default templates aren't doing it for you, you can override the default templates with your own by setting configuration variables:

  blogIndexTemplate: 'myBlogIndexTemplate', // '/blog' route
  blogShowTemplate: 'myShowBlogTemplate'    // '/blog/:slug' route

In your templates, you can use these Spacebars helpers provided by the package to display blog posts with some basic, semantic markup:

  • {{> blogIndex}}
    - Renders list of blog posts (
  • {{> blogShow}}
    - Renders single blog post (


If you don't want any of our markup, use the blog data provided in the template context directly:

  • blogReady
    - Flag that is true when blog data is ready
  • posts
    - List of
    blog post objects (
  • post
    blog post object (


Custom Layout

By default, the layout configured for your app is used. To specify a layout for only the blog pages:

  blogLayoutTemplate: 'myBlogLayout'
Custom notFound

By default, if the browser loads a non-existent blog post, it will use your app's

handling. You can provide a custom
to use when a blog post slug is not found.
  blogNotFoundTemplate: 'myNotFoundTemplate'


Meteor Blog has no built-in commenting feature.


This package supports DISQUS comments. Configure your DISQUS short name in the client and comments will render below all your blog posts. If you use your own

template, include
{{> disqus this}}
to display comments.
  comments: {
    disqusShortname: 'myshortname'

This package has experimental integration with SideComments.js. Enable side comments in your blog settings. Currently, side comments uses the Meteor accounts for your Meteor site as comment users, which is probably not what you want. You can also allow anonymous comments, which lets anyone type in anything without even a name. Also, probably not what you want.

  comments: {
    useSideComments: true, // default is false
    allowAnonymous: true   // default is false


Adding images to your blog posts works out of the box and saves the images to gridFS in your Mongo database.

S3 Images

You can optionally have these images to an Amazon S3 bucket that you configure. To setup S3 for file storage, add the following in

(or any other location of your choice).
  "public": {
    "blog": {
      "useS3": true
  "private": {
    "blog": {
      "s3Config": {
        "bucket": "your-bucket-name",
        "s3ACL": "public-read",
        "s3MaxTries": 2,
        "accessKeyId": "XXXXXXXXXXXXX",
        "region": "(OPTIONAL most of the time)"

Blog Post Modes

When creating a blog post in the admin, you can set one of three modes:

  • Public
    - Listed in the blog and viewable by anyone
  • Private
    - Not listed in the blog, but viewable by anyone with the link
  • Draft
    - Unpublished and only viewable in the blog admin area

Blog Post Excerpt

By default, blog summaries or excerpts are generated by taking the 1st paragraph from the blog post. You can override this function by configuring a custom

. For example, if you wanted to create an excerpt from the 1st sentence:
  excerptFunction: function(body) {
    return body.split('.')[0] + '.';


By default, blog posts are paged in 20 at a time. You can modify this value in settings. Set to

to turn off paging entirely.
  pageSize: 10

The default

template displays a
Load More
button. If you use your own template, include the
helper to display the button.

Code Highlighting

If you fancy a coding blog, the blog package supports syntax highlighting using highlight.js. If enabled, any content within

tags will get modified for syntax highlighting. You can specify any
style file
. Example config:
  syntaxHighlighting: true, // default is false
  syntaxHighlightingTheme: 'atelier-dune.dark' // default is 'github'

Social Sharing

This package depends on the

package for powering social sharing. By default, Facebook and Twitter buttons are displayed. You can pass a configuration directly to

. If you use your own
template, include
{{> shareit}}
to display share buttons.
  shareit: {
    siteOrder: ['twitter', 'facebook', 'pinterest'] // add Pinterest button

Recent Posts Widget

You can include a basic snippet of HTML displaying recent blog posts (e.g. on your home page). Insert the inclusion helper where you want the recent posts to appear.

{{> blogLatest}}

Or you can specify the # of posts to show:

{{> blogLatest num=5}}

There are classes in the template for styling, but you can use your own widget template as well.

  blogLatestTemplate: 'myLatestWidgetTemplate'

And then include

{{> myLatestWidgetTemplate}}
anywhere you want. It will receive the following data context variables:

  • latest
    - List of most recent
    blog posts
  • date
    - Date format helper


An RSS feed is automatically generated at

. To set the title and description in the feed, configure RSS:
  rss: {
    title: 'My blog title',
    description: 'My blog description'

Add a head tag somewhere in your

files so your RSS feed can be discovered:

Language support

You can change the text of the labels the blog uses in the Blog.config.
The following are the default labels used:

  language: {
    blogEmpty: 'This blog is looking pretty empty...',
    backToBlogIndex: 'Back to the Blog',
    loadMore: 'Load More',
    tags: 'Tags',
    slug: 'Slug',
    metaDescription: 'Meta Description',
    body: 'Body',
    showAsVisual: 'Visual',
    showAsHtml: 'HTML',
    save: 'Save',
    cancel: 'Cancel',
    "delete": 'Delete',
    metaAuthorBy: 'By',
    metaAuthorOn: 'on',
    edit: 'Edit',
    areYouSure: 'Are you sure?',
    disqusPoweredBy: 'comments powered by',
    adminHeader: 'Blog Admin',
    addPost: 'Add Blog Post',
    allPosts: 'All Posts',
    myPosts: 'My Posts',
    addPost: 'Add Post',
    editPost: 'Edit Post',
    title: 'Title',
    author: 'Author',
    updatedAt: 'Updated At',
    publishedAt: 'Published At',
    visibleTo: 'Visible To',
    featuredImage: 'Featured Image',
    selectFile: 'Select File',
    imageAsBackground: 'Use as background for title',
    enterTag: 'Type in a tag & hit enter',
    postCreateFirst: 'Create the first blog',
    postVisibilityAdmins: 'Me & Admins only',
    postVisibilityLink: 'Anyone with link',
    postVisibilityAnyone: 'The world',
    saved: 'Saved',
    editFeaturedImageSaved: 'Featured image saved',
    editErrorSlugExists: 'Blog with this slug already exists',
    editErrorBodyRequired: 'Blog body is required'

You can change the format of dates the blog uses in the Blog.config. Any acceptable display format supported by Moment.js can be selected (e.g., 'D MMM YYYY' or 'YYYY-MM-DD'). The default date format is:

  dateFormat: 'MMM Do, YYYY'



We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.