AlgoliaSearch for Jekyll
Ruby Shell
Failed to load latest commit information.
docs docs(travis): Add documentation on configuring TravisCI for `gh-pages` Oct 7, 2015
gemfiles fix(dependencies: Stop fixing Jekyll version as a core dependency Mar 8, 2016
lib chore(bump): Version bump to 0.8.0 Jul 13, 2016
scripts fix(release): Update dependencies between each step Mar 8, 2016
spec fix(test): Use string instead of symbol for test config Jul 13, 2016
txt feat(ENV): Allow passing application_id and index_name as ENV Jul 13, 2016
.coveralls.yml test(coveralls): Add coverall files Jul 16, 2015
.gitignore Updating README to explain how to use key with access to `_tmp` Dec 12, 2016
.rspec test(rspec): Start adding rspec tests Jul 2, 2015
.rubocop.yml Add rubocop config Jul 15, 2015
.travis.yml fix(v3): Stop throwing deprecation warning when using Jekyll v3 Jan 11, 2016
Appraisals fix(v3): Stop throwing deprecation warning when using Jekyll v3 Jan 11, 2016 fix(dependencies): Improve TDD watchers on various jekyll versions Mar 8, 2016
Gemfile fix(dependencies: Stop fixing Jekyll version as a core dependency Mar 8, 2016
Guardfile_jekyllv2 fix(dependencies): Improve TDD watchers on various jekyll versions Mar 8, 2016
Guardfile_jekyllv3 fix(dependencies): Improve TDD watchers on various jekyll versions Mar 8, 2016
LICENSE.txt feat(jeweler): Add Jeweler Jul 16, 2015 Updating README to explain how to use key with access to `_tmp` Dec 12, 2016
Rakefile fix(version): Do not depend on Rubygem to get the version Jul 29, 2015
algoliasearch-jekyll.gemspec Regenerate gemspec for version 0.8.0 Jul 13, 2016

Algolia Jekyll Plugin

Gem Version Build Status Coverage Status Code Climate Jekyll >= 2.5

Jekyll plugin to automatically index your Jekyll posts and pages into an Algolia index by simply running jekyll algolia push.


$ bundle exec jekyll algolia push

This will push the content of your jekyll website to your Algolia index.

You can specify any option you would normally pass to jekyll build, like --config, --source, --destination, etc.


First, add the algoliasearch-jekyll gem to your Gemfile, in the :jekyll_plugins section. If you do not yet have a Gemfile, here is the minimum content to get your started.

source ''

gem 'jekyll', '~> 2.5.3'

group :jekyll_plugins do
  gem 'algoliasearch-jekyll', '~> 0.8.0'

Once this is done, download all dependencies with bundle install.

Then, add algoliasearch-jekyll to your _config.yml file, under the gems section, like this:

  - algoliasearch-jekyll

If everything went well, you should be able to execute jekyll help and see the algolia subcommand listed.


Add information about your Algolia configuration into the _config.yml file, under the algolia section, like this:

  application_id: 'your_application_id'
  index_name:     'your_index_name'

You can also define the ALGOLIA_APPLICATION_ID and ALGOLIA_INDEX_NAME environment variables. If present, they will be used instead of the options in _config.yml.

You write api key will be read from the ALGOLIA_API_KEY environment variable. You can define it on the same line as your command, allowing you to type ALGOLIA_API_KEY='your_write_api_key' jekyll algolia push.

Note that your API key should have write access to both the index_name and _tmp suffixed version of it (eg. your_index_name and your_index_name_tmp) in the previous example). This is due to the way we do atomic pushes by pushing to a temporary index and then renaming it. The easiest way is to create a key with access to in the index_name* index (note the * suffix).

⚠ Other, unsecure, method ⚠

You can also store your write api key in a file named _algolia_api_key, in your source directory. If you do this we very, very, very strongly encourage you to make sure the file is not tracked in your versioning system.


The plugin uses sensible defaults, but you may want to override some of its configuration. Here are the various options you can add to your _config.yml file, under the algolia section:


Defines which files should not be indexed for search.

    - index.html


Defines the css selector inside a page/post used to choose which parts to index. It is set to all paragraphs (<p>) by default.

If you would like to also index lists, you could set it like this:

  record_css_selector: 'p,ul'


Here you can pass any specific index settings to your Algolia index. All the settings supported by the API can be passed here.


If you want to activate distinct and some snippets for example, you would do:

    attributeForDistinct: 'hierarchy'
    distinct: true
    attributesToSnippet: ['text:20']

If you want to search in other fields than the default ones, you'll have to edit the attributesToIndex (default is %w(title h1 h2 h3 h4 h5 h6 unordered(text) unordered(tags))

      - title
      - h1
      - h2
      - h3
      - h4
      - h5
      - h6
      - unordered(text)
      - unordered(tags)
      - your_custom_attribute_1
      - your_custom_attribute_2
      - ...


The AlgoliaSearchRecordExtractor contains two methods (custom_hook_each and custom_hook_all) that are here so you can overwrite them to add your custom logic. They currently simply return the argument they take as input.

The best way to override them is to create a ./_plugins/search.rb file, with the following content:

class AlgoliaSearchRecordExtractor
  # Hook to modify a record after extracting
  def custom_hook_each(item, node)
    # `node` is a Nokogiri HTML node, so you can access its type through ``
    # or its classname through `node.attr('class')` for example

    # Just return `nil` instead of `item` if you want to discard this record

  # Hook to modify all records after extracting
  def custom_hook_all(items)

The AlgoliaSearchJekyllPush class also lets user define the custom_hook_excluded_file? method. This method is called on every file that the plugin thinks it should parse and index. If it returns true, the file is not indexed. You can add here your custom logic to exclude some files.

class AlgoliaSearchJekyllPush < Jekyll::Command
  class << self
    # Hook to exclude some files from indexing
    def custom_hook_excluded_file?(file)
      return true if filepath =~ %r{^/excluded_dir/}

Command line

Here is the list of command line options you can pass to the jekyll algolia push command:

Flag Description
--config ./_config.yml You can here specify the config file to use. Default is _config.yml
--future With this flag, the command will also index posts with a future date
--limit_posts 10 Limits the number of posts to parse and index
--drafts Index drafts in the _drafts folder as well
--dry-run or -n Do a dry run, do not actually push anything to your index
--verbose Display more information about what is going to be indexed


The algoliasearch-jekyll plugin works for versions of Jekyll starting from 2.5, with a version of Ruby of at least 2.0. You also need Bundler to easily add the gem as a dependency to Jekyll.


This plugin will only index your data in your Algolia index. Adding search capabilities is quite easy. You can follow our tutorials or use our forked version of the popular Hyde theme.

GitHub Pages

GitHub does not allow custom plugins to be run on GitHub Pages. This means that you'll either have to run bundle exec jekyll algolia push manually, or configure TravisCI to do it for you.

Travis CI is an hosted continuous integration service, and it's free for open-source projects. Properly configured, it can automatically reindex your data whenever you push to gh-pages.

For it to work, you'll have 3 steps to perform.

1. Create a .travis.yml file

Create a file named .travis.yml at the root of your project, with the following content:

language: ruby
cache: bundler
    - gh-pages
  - bundle exec jekyll algolia push
 - 2.2

This file will be read by Travis and instruct it to fetch all dependencies defined in the Gemfile, then run jekyll algolia push. This will only be triggered when data is pushed to the gh-pages branch.

2. Update your _config.yml file to exclude vendor

Travis will download all you Gemfile dependencies into a directory named vendor. You have to tell Jekyll to ignore this directory, otherwise Jekyll will try to parse it (and fail).

Doing so is easy, just add the following line to your _config.yml file:

exclude: [vendor]

3. Configure Travis

In order for Travis to be able to push data to your index on your behalf, you have to give it your write API Key. This is achieved by defining an ALGOLIA_API_KEY environment variable in Travis settings.

You should also uncheck the "Build pull requests" option, otherwise any pull request targeting gh-pages will trigger the reindexing.

Travis Configuration


Commit all the changes to the files, and then push to gh-pages. Travis will catch the event and trigger your indexing for you. You can follow the Travis job execution directly on their website.