├── .gitignore ├── .ruby-version ├── .travis.yml ├── 404.html ├── Gemfile ├── Gemfile.lock ├── README.md ├── _config.yml ├── _includes ├── algolia.html └── head.html ├── _layouts └── home.html ├── _posts ├── 2012-07-03-great-discussions-at-leweb12-london.md ├── 2012-07-05-why-develop-our-own-unicode-library.md ├── 2012-07-08-were-participating-to-the-evernote-devcup.md ├── 2012-07-12-ios-when-arc-is-a-bad-idea.md ├── 2012-07-24-need-performance-on-mobile-use-c-cpp.md ├── 2012-08-01-free-marketing-wwdc2012.md ├── 2012-08-16-algolia-search-beta-is-out.md ├── 2012-08-22-results-of-the-evernote-devcup.md ├── 2012-09-03-algolia-search-beta-2-is-out.md ├── 2012-09-24-algolia-search-beta-3-is-out.md ├── 2012-09-28-upcoming-events-appsworld-mobility-for-business-appdays.md ├── 2012-10-07-a-few-thoughts-after-apps-world.md ├── 2012-10-19-painless-integration-crystal-clear-documentation-please-welcome-algolia-search-beta-4.md ├── 2012-11-12-the-ordeal-of-obtaining-an-apple-developer-professional-account.md ├── 2012-11-21-algolia-search-is-out.md ├── 2012-11-29-why-autocomplete-in-twitter-on-mobile-sucks.md ├── 2012-11-30-we-are-seedcamp-finalists.md ├── 2012-12-13-our-smart-contacts-demo-hits-the-app-store.md ├── 2012-12-20-windows-8-beta-is-out-algolia-search-now-available-for-microsoft-desktops-and-tablets.md ├── 2012-12-21-never-ever-hinder-the-use-of-your-products.md ├── 2012-12-28-simplicity-is-the-most-complex-feature.md ├── 2013-01-10-android-ndk-how-to-reduce-libs-size.md ├── 2013-01-15-seedcamp-tips-and-advice-from-a-finalist.md ├── 2013-01-24-why-android-apk-format-is-a-terrible-mistake.md ├── 2013-01-28-sharypic-benefits-from-algolia-search.md ├── 2013-01-29-we-ranked-second-at-start-in-paris.md ├── 2013-02-19-meet-us-at-the-mobile-world-congress.md ├── 2013-02-19-round-table-at-microsoft-techdays-2013.md ├── 2013-03-12-algolia-search-is-now-available-for-free.md ├── 2013-03-18-our-saas-version-is-in-beta.md ├── 2013-03-26-instant-search-on-crunchbase.md ├── 2013-04-11-we-are-finalists-at-next-berlin.md ├── 2013-04-16-algolia-search-is-now-available-for-rubymotion.md ├── 2013-04-16-v2-our-new-offline-search-sdk-with-geo-search-and-other-features.md ├── 2013-04-25-algolia-search-offline-sdk-now-supports-cocoapods.md ├── 2013-05-21-instant-search-on-ios-app-store.md ├── 2013-05-24-algolia-search-offline-2-1-is-out.md ├── 2013-05-28-discover-our-6-new-search-as-a-service-api-clients.md ├── 2013-06-17-discover-our-new-java-android-search-as-a-service-api-clients-at-droidcon-paris.md ├── 2013-06-24-check-out-the-new-iosos-x-clients-for-our-search-as-a-service-offer.md ├── 2013-07-08-excellent-asian-languages-support-in-our-offline-search-sdk-2-2.md ├── 2013-07-18-our-search-as-a-service-offer-has-now-10-api-clients.md ├── 2014-01-06-improving-ranking-twitter-handles-search.md ├── 2014-01-18-search-grader-engine-performing.md ├── 2014-01-24-hacker-news-search-algolia.md ├── 2014-01-29-postmortem-todays-8min-indexing-downtime.md ├── 2014-02-10-mongodb-and-sql-connectors.md ├── 2014-03-14-added-asian-datacenter-offer.md ├── 2014-03-15-algolia-heroku-add-on-enters-ga.md ├── 2014-03-17-caused-todays-performance-issues-europe-will-happen.md ├── 2014-03-18-handle-security-realtime-search.md ├── 2014-03-25-hipchats-blog-algolia-extends-hipchat-customer-support.md ├── 2014-03-29-introducing-algolias-search-analytics.md ├── 2014-04-09-dealing-openssl-security-issue.md ├── 2014-05-02-inside-growthhackers-implementation-of-algolia.md ├── 2014-05-14-jsonp-still-mandatory.md ├── 2014-05-22-synonym-search-engine.md ├── 2014-06-05-popular-misperceptions-search-service.md ├── 2014-07-09-keeping-data-in-your-search-engine-up-to-date.md ├── 2014-07-11-deploying-algolia-search-2-million-products.md ├── 2014-08-21-algolia-for-realtime-expense-reporting.md ├── 2014-08-28-concertwith-mes-competitive-edge-revamped-search-ux-algolia.md ├── 2014-09-01-4th-datacenter-california.md ├── 2014-10-10-aftership-leverages-algolias-search-service-track-10-million-packages-around-world.md ├── 2014-11-14-jadopado-delivers-instasearch-mobile-web-powered-algolia.md ├── 2014-11-28-black-thursday-dns-issue.md ├── 2014-12-01-fanfootage-solving-search-problem-algolia.md ├── 2014-12-01-search-strategic-engage-visitors.md ├── 2014-12-23-christmas-gifthub-awesome-autocomplete.md ├── 2015-01-12-try-new-experimental-version-hn-search.md ├── 2015-02-18-distributed-search-network-latency-ruins-search-experience.md ├── 2015-04-20-quadrant-io-solves-the-frustration-of-economic-data-search-with-algolia.md ├── 2015-05-06-modern-javascript-libraries-the-isomorphic-way.md ├── 2015-05-11-dns-fallback-for-better-resilience.md ├── 2015-05-28-we-just-raised-our-series-a-whats-next.md ├── 2015-06-15-when-solid-state-drives-are-not-that-solid.md ├── 2015-07-15-new-distributed-search-network-texas.md └── 2017-12-20-welcome-to-jekyll.markdown ├── about.md ├── assets ├── 2015-04-27-161853_1266x829_scrot.png ├── 2015-04-27-162229_1258x982_scrot.png ├── 2015-04-27-170339_976x845_scrot.png ├── 2015-04-27-170757_1288x486_scrot.png ├── 2015-04-27-171034_1296x385_scrot.png ├── 2015-04-27-172249_1248x868_scrot.png ├── 2015-04-27-174139_920x306_scrot.png ├── 2015-04-28-224616_1126x129_scrot.png ├── 2015-04-28-225743_1629x497_scrot.png ├── 2015-04-28-232019_1153x526_scrot.png ├── 2015-04-28-232444_1275x569_scrot.png ├── Capture-decran-2014-01-17-18.22.23.png ├── Capture-decran-2014-01-24-01.26.08-600x150.png ├── Capture-decran-2014-07-11-17.31.04-1024x486.png ├── ChromeWebStore_BadgeWBorder_v2_206x58.png ├── CitiesSuggestIOSPortraitSmall-155x300.png ├── CitiesSuggestIPhone5Slide3-300x194.png ├── DSN-b3ce122c790c492c2f2c8ddbabaae464.jpg ├── Divided screen hipchat algolia.png ├── Divided%20screen%20hipchat%20algolia.png ├── Emergency-exit-prev.jpg ├── NextBerlin-300x155.png ├── Omar-Kassim-Founder-of-JadoPado-Image-2-1.jpg ├── Screen-Shot-2013-12-23-at-11.38.19-263x300.png ├── Screen-Shot-2013-12-23-at-11.40.09-263x300.png ├── Screen-Shot-2013-12-23-at-11.42.01-262x300.png ├── Screen-Shot-2013-12-23-at-11.47.52.png ├── Screen-Shot-2014-03-13-at-17.51.50-300x199.png ├── Screen-Shot-2014-08-14-at-16.37.25.png ├── Screen-Shot-2014-08-14-at-16.38.34.png ├── Screen-Shot-2015-04-13-at-18.06.28.png ├── ScreenshotTwitter.png ├── Sharypic.png ├── SmartContact-iphone5-489x1024.png ├── StartInParis-1024x768.jpg ├── StartInParis.gif ├── Stopwatch-lowres-300x225.jpg ├── Top categories.png ├── Top-search-1024x409.png ├── Trend Louboutin.png ├── airpair.png ├── amazon-search-20011.png ├── amazon-search-today-e1417016290894.png ├── appstore.jpg ├── appsworld-300x224.jpg ├── available-on-iphone-app-store-logo.png ├── blackberry-300x224.jpg ├── citiessuggest-leweb-180x300.png ├── dallas2.jpg ├── dontmakemethink.jpeg ├── dsn-shot.jpg ├── eoin-o-driscoll.png ├── fanfootage.gif ├── growthacker.jpg ├── guy4.jpg ├── hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen Shot 2015-01-10 at 17.22.06.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen%20Shot%202015-01-10%20at%2017.22.06.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen Shot 2015-01-10 at 17.23.21.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen%20Shot%202015-01-10%20at%2017.23.21.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen Shot 2015-01-10 at 17.24.51.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen%20Shot%202015-01-10%20at%2017.24.51.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen Shot 2015-01-10 at 17.32.21.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen%20Shot%202015-01-10%20at%2017.32.21.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen Shot 2015-01-10 at 17.35.07.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen%20Shot%202015-01-10%20at%2017.35.07.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen Shot 2015-01-10 at 17.38.44.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen%20Shot%202015-01-10%20at%2017.38.44.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen Shot 2015-01-10 at 17.45.01.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen%20Shot%202015-01-10%20at%2017.45.01.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen Shot 2015-01-10 at 18.00.12.png ├── hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen%20Shot%202015-01-10%20at%2018.00.12.png ├── hackpad.com_Y3thzadEtdY_p.233467_1419338581444_capture.gif ├── hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen Shot 2014-12-23 at 13.46.04.png ├── hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen%20Shot%202014-12-23%20at%2013.46.04.png ├── hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen Shot 2014-12-23 at 13.45.54.png ├── hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen%20Shot%202014-12-23%20at%2013.45.54.png ├── hand-203x300.jpg ├── jadopado.gif ├── leanstack.jpg ├── nsone-dig-latency.png ├── objC.png ├── recommendations.gif ├── route53-dig-latency.png ├── rubymotion1-270x300.png ├── sadnessofsearch.png ├── search.gif ├── search.png ├── searchForEvernoteSmall.png ├── searchquadrant1.gif ├── seedcamp.png ├── shot.jpg ├── slowerthanaverage.png ├── teddy.png ├── user-experience.jpg ├── vinny.png ├── wwdc1.jpg └── wwdc2.jpg ├── index.md └── netlify.toml /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | .jekyll-metadata 3 | .sass-cache 4 | Thumbs.db 5 | bower_components 6 | node_modules 7 | npm-debug.log 8 | tmp 9 | *~ 10 | _algolia_api_key 11 | _site 12 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.4 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | cache: bundler 3 | branches: 4 | only: 5 | - master 6 | script: 7 | - bundle exec jekyll algolia 8 | rvm: 9 | - 2.4 10 | notifications: 11 | email: 12 | on_success: never 13 | on_failure: never 14 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | 18 | 19 |
20 |

404

21 | 22 |

Page not found :(

23 |

The requested page could not be found.

24 |
25 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source 'https://rubygems.org' 4 | 5 | # Hello! This is where you manage which Jekyll version is used to run. 6 | # When you want to use a different version, change it below, save the 7 | # file and run `bundle install`. Run Jekyll with `bundle exec`, like so: 8 | # 9 | # bundle exec jekyll serve 10 | # 11 | # This will help ensure the proper Jekyll version is running. 12 | # Happy Jekylling! 13 | gem 'jekyll', '~> 3.8' 14 | 15 | # This is the default theme for new Jekyll sites. You may change this to 16 | # anything you like. 17 | gem 'minima', '~> 2.5' 18 | 19 | # If you want to use GitHub Pages, remove the "gem "jekyll"" above and 20 | # uncomment the line below. To upgrade, run `bundle update github-pages`. 21 | # gem "github-pages", group: :jekyll_plugins 22 | 23 | # If you have any plugins, put them here! 24 | group :jekyll_plugins do 25 | gem 'jekyll-algolia' 26 | gem 'jekyll-feed', '~> 0.10' 27 | end 28 | 29 | # Windows does not include zoneinfo files, so bundle the tzinfo-data gem 30 | gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby] 31 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | addressable (2.5.2) 5 | public_suffix (>= 2.0.2, < 4.0) 6 | algolia_html_extractor (2.5.2) 7 | json (~> 2.0) 8 | nokogiri (~> 1.8.2) 9 | algoliasearch (1.19.1) 10 | httpclient (~> 2.8.3) 11 | json (>= 1.5.1) 12 | colorator (1.1.0) 13 | concurrent-ruby (1.0.5) 14 | em-websocket (0.5.1) 15 | eventmachine (>= 0.12.9) 16 | http_parser.rb (~> 0.6.0) 17 | eventmachine (1.2.7) 18 | ffi (1.9.25) 19 | filesize (0.1.1) 20 | forwardable-extended (2.6.0) 21 | http_parser.rb (0.6.0) 22 | httpclient (2.8.3) 23 | i18n (0.9.5) 24 | concurrent-ruby (~> 1.0) 25 | jekyll (3.8.3) 26 | addressable (~> 2.4) 27 | colorator (~> 1.0) 28 | em-websocket (~> 0.5) 29 | i18n (~> 0.7) 30 | jekyll-sass-converter (~> 1.0) 31 | jekyll-watch (~> 2.0) 32 | kramdown (~> 1.14) 33 | liquid (~> 4.0) 34 | mercenary (~> 0.3.3) 35 | pathutil (~> 0.9) 36 | rouge (>= 1.7, < 4) 37 | safe_yaml (~> 1.0) 38 | jekyll-algolia (1.2.0) 39 | algolia_html_extractor (~> 2.5.1) 40 | algoliasearch (~> 1.18) 41 | filesize (~> 0.1) 42 | jekyll (~> 3.0) 43 | json (~> 2.0) 44 | nokogiri (~> 1.6) 45 | progressbar (~> 1.9) 46 | verbal_expressions (~> 0.1.5) 47 | jekyll-feed (0.10.0) 48 | jekyll (~> 3.3) 49 | jekyll-sass-converter (1.5.2) 50 | sass (~> 3.4) 51 | jekyll-seo-tag (2.5.0) 52 | jekyll (~> 3.3) 53 | jekyll-watch (2.0.0) 54 | listen (~> 3.0) 55 | json (2.1.0) 56 | kramdown (1.17.0) 57 | liquid (4.0.0) 58 | listen (3.1.5) 59 | rb-fsevent (~> 0.9, >= 0.9.4) 60 | rb-inotify (~> 0.9, >= 0.9.7) 61 | ruby_dep (~> 1.2) 62 | mercenary (0.3.6) 63 | mini_portile2 (2.3.0) 64 | minima (2.5.0) 65 | jekyll (~> 3.5) 66 | jekyll-feed (~> 0.9) 67 | jekyll-seo-tag (~> 2.1) 68 | nokogiri (1.8.2) 69 | mini_portile2 (~> 2.3.0) 70 | pathutil (0.16.1) 71 | forwardable-extended (~> 2.6) 72 | progressbar (1.9.0) 73 | public_suffix (3.0.2) 74 | rb-fsevent (0.10.3) 75 | rb-inotify (0.9.10) 76 | ffi (>= 0.5.0, < 2) 77 | rouge (3.1.1) 78 | ruby_dep (1.5.0) 79 | safe_yaml (1.0.4) 80 | sass (3.5.6) 81 | sass-listen (~> 4.0.0) 82 | sass-listen (4.0.0) 83 | rb-fsevent (~> 0.9, >= 0.9.4) 84 | rb-inotify (~> 0.9, >= 0.9.7) 85 | verbal_expressions (0.1.5) 86 | 87 | PLATFORMS 88 | ruby 89 | 90 | DEPENDENCIES 91 | jekyll (~> 3.8) 92 | jekyll-algolia 93 | jekyll-feed (~> 0.10) 94 | minima (~> 2.5) 95 | tzinfo-data 96 | 97 | BUNDLED WITH 98 | 1.16.1 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jekyll-algolia-example 2 | 3 | 4 | This is an example of how you can integrate the [jekyll-algolia][1] plugin into the default Jekyll theme. 5 | 6 | You can [see it live][2] or [follow the tutorial][3]. 7 | 8 | 9 | [1]: https://community.algolia.com/jekyll-algolia/ 10 | [2]: https://community.algolia.com/jekyll-algolia-example/ 11 | [3]: https://community.algolia.com/jekyll-algolia/blog.html 12 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Jekyll! 2 | # 3 | # This config file is meant for settings that affect your whole blog, values 4 | # which you are expected to set up once and rarely edit after that. If you find 5 | # yourself editing this file very often, consider using Jekyll's data files 6 | # feature for the data you need to update frequently. 7 | # 8 | # For technical reasons, this file is *NOT* reloaded automatically when you use 9 | # 'bundle exec jekyll serve'. If you change this file, please restart the server process. 10 | 11 | # Site settings 12 | # These are used to personalize your new site. If you look in the HTML files, 13 | # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on. 14 | # You can create any custom variable you would like, and they will be accessible 15 | # in the templates via {{ site.myvariable }}. 16 | title: jekyll-algolia example 17 | email: your-email@example.com 18 | description: >- # this means to ignore newlines until "baseurl:" 19 | Write an awesome description for your new site here. You can edit this 20 | line in _config.yml. It will appear in your document head meta (for 21 | Google search results) and in your feed.xml site description. 22 | baseurl: "/jekyll-algolia-example" # the subpath of your site, e.g. /blog 23 | url: "" # the base hostname & protocol for your site, e.g. http://example.com 24 | twitter_username: jekyllrb 25 | github_username: jekyll 26 | 27 | # Build settings 28 | markdown: kramdown 29 | theme: minima 30 | plugins: 31 | - jekyll-feed 32 | 33 | algolia: 34 | application_id: latency 35 | index_name: jekyll-algolia-example 36 | search_only_api_key: 12b7c60f33a700558528c3dde43b47f1 37 | 38 | # Exclude from processing. 39 | # The following items will not be processed, by default. Create a custom list 40 | # to override the default setting. 41 | # exclude: 42 | # - Gemfile 43 | # - Gemfile.lock 44 | # - node_modules 45 | # - vendor/bundle/ 46 | # - vendor/cache/ 47 | # - vendor/gems/ 48 | # - vendor/ruby/ 49 | -------------------------------------------------------------------------------- /_includes/algolia.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 61 | 62 | 96 | 97 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% if jekyll.environment == 'production' and site.google_analytics %} 9 | {% include google-analytics.html %} 10 | {% endif %} 11 | 12 | -------------------------------------------------------------------------------- /_layouts/home.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | 7 | {{ content }} 8 | 9 |

10 | This is an example of how you can integrate the 11 | 12 | jekyll-algolia 13 | plugin into your Jekyll theme. 14 |

15 | 16 |

17 | Check out the 18 | source 19 | or 20 | the tutorial 21 | for more information. 22 |

23 | 24 |

Posts

25 | 26 | 27 | 28 |
29 | {% for post in site.posts %} 30 |
31 | {% assign date_format = site.minima.date_format | default: "%b %-d, %Y" %} 32 | 33 | 34 |

35 | {{ post.title | escape }} 36 |

37 |
{{ post.excerpt }}
38 |
39 | {% endfor %} 40 |
41 | 42 |

subscribe via RSS

43 | 44 |
45 | 46 | {% include algolia.html %} 47 | 48 | -------------------------------------------------------------------------------- /_posts/2012-07-03-great-discussions-at-leweb12-london.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Great discussions at LeWeb'12 London 4 | author: Nicolas 5 | --- 6 | 7 | On June 19 & 20th, I had the chance to participate to [LeWeb 2012 8 | London][1] edition. This year theme was "Faster than 9 | Real Time" and we had an impressive list of speakers! But the true value of 10 | LeWeb is elsewhere: It's in the 1283 people from 52 countries who were present 11 | and with whom you could network! 12 | 13 | They chose [Presdo Match][2] to help people meet and 14 | honestly... this tool would benefit from some improvements, especially a 15 | mobile version! Still, I was able to find no fewer than 100 participants 16 | having the "mobile" keyword in their profile and, from there, organize a 17 | handful of meetings. Thanks to all of you who accepted to meet me or whom I 18 | met unplanned, with a special thanks to [Paul Ardeleanu][3], 19 | [Gora Sudindranath][4], [Lindsey C. 20 | Holmes][5], [Marius 21 | Rostad][6], [Kevin 22 | McDonagh][7] and [Alexandre 23 | Delivet][8] for their precious feedbacks about 24 | Algolia. 25 | 26 | [caption id="attachment_82" align="alignright" width="180"][![Cities Suggest 27 | Demo][9]](https://blog.algolia.com/wp- 28 | content/uploads/2012/07/citiessuggest-leweb.png) Cities Suggest demo @ 29 | LeWeb[/caption] 30 | 31 | I had the opportunity to do the very first demonstrations of our instant 32 | suggest lib, and that was both exhilarating and frustrating! We chose to 33 | develop a small proof of concept suggesting city names from anywhere in the 34 | world. Here's what I learned: 35 | 36 | * A demo is better than many words! Even if most people knew what I meant by "google instant suggest", the demo was key in clarifying our offering. 37 | * Even if we chose cities because it was easy to demonstrate (thanks to the geonames database), it can be interesting in itself! 38 | * 100ms seemed a pretty fast response time in our initial testing, but it's actually way too slow to have a smooth user experience. 39 | 40 | Over all that was a very good experience, and I came back with a few 41 | improvements to implement (most coming from my own frustration showing the 42 | demo while the feedback was actually very positive!) 43 | 44 | The most important piece of feedback was about the perceived sluggishness of 45 | the app. We decided to implement an asynchronous version of the lib. Beware, 46 | it actually comes with a drawback for our users; It's significantly more 47 | difficult to integrate. But it did not take long for us to decide it was the 48 | way to go, since the perception of speed is so natural that the benefit far 49 | outweighs the longer integration code. We'll now work on simplifying it! 50 | 51 | We'll soon do a post about this demo. In the meantime, stay tuned! 52 | 53 | 54 | [1]: http://london.leweb.co/ 55 | [2]: http://match.presdo.com/ 56 | [3]: http://hello24.com/ 57 | [4]: http://www.linkedin.com/in/goras 58 | [5]: http://twitter.com/lindseycholmes 59 | [6]: https://twitter.com/#!/portart 60 | [7]: https://twitter.com/#!/kevinmcdonagh 61 | [8]: http://www.alexdelivet.com/ 62 | [9]: ./assets/citiessuggest-leweb-180x300.png 63 | -------------------------------------------------------------------------------- /_posts/2012-07-08-were-participating-to-the-evernote-devcup.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Search for Evernote: We''re in the Evernote DevCup!' 4 | author: Nicolas 5 | --- 6 | 7 | You mint already be familiar with Evernote. It's a great company that delivers 8 | an impressive product that I use often, both professionally and personally. 9 | When we heard about them organizing their second developer competition, we 10 | immediately thought about the fantastic opportunity it could be for Algolia! 11 | 12 | Let's sum up: 13 | 14 | * It's an excellent use case for our first lib: search in Evernote mobile apps is quite awful and we could really bring a better user experience! 15 | * It's a good incentive to create a second demo (after Cities Suggest) that's more convincing, especially for Evernote's users. 16 | * It's an opportunity to get some media coverage :) 17 | * And most of all it's an excellent occasion to pitch our lib to the Evernote team. We would love to have them as an happy customer! 18 | 19 | As you see, even if we don't make it to the finals, the decision was a no- 20 | brainer! But, wait... we'd love to go to the finals! **And you can help us!** 21 | Part of the competition is to get the maximum public support. You want to hep 22 | us? Just go to our [submission 23 | page][1] and 24 | vote once a day! Tell your friends! Tell your grandma! You can even log in via 25 | facebook ;) 26 | 27 | Want to know more about our app "Search for Evernote"? Here comes the video. 28 | You can also download the app directly from 29 | [http://www.algolia.com/evernote.html](http://www.algolia.com/evernote.html) 30 | 31 | [1]: http://devcup.evernote.com/submissions/8585-search-for-evernote 32 | -------------------------------------------------------------------------------- /_posts/2012-07-24-need-performance-on-mobile-use-c-cpp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: C/C++ is still the only way to have high performance on Mobile 4 | author: Julien 5 | --- 6 | 7 | When it comes to programming languages and performance, you can read all and 8 | its opposite on the web. It's definitely a very controversial topic! 9 | 10 | **[Edit 15-Nov-2012]** I had questions on [reddit][1] about the data-structures and algorithms we used. We develop an [embedded search engine][2] for mobile, and tests were done on our own data-structure that is far more efficient than SQLite or other platform options for this use-case. **[/Edit]** 11 | 12 | For Algolia the story started when researching an instant suggest algorithm. I 13 | used Java for two reasons: 14 | 15 | * **Main reason**: our first client was using Java on Google App Engine 16 | * **Secondary**: at that stage, I was doing a lots of refactoring and Eclipse is very efficient for these tasks 17 | 18 | Once our algorithm was designed, I started to optimize performance on a 19 | desktop computer (core I7 950). For this, I indexed all titles of the English 20 | version of Wikipedia (4 millions titles). I optimized the Java code mainly by 21 | reducing the number of allocations. All instant suggest queries were then 22 | faster than 10ms. 23 | 24 | 25 | As we planned from the begining to support iOS and Android, I needed to 26 | optimize for high performance on mobile. I then ported the Java code to 27 | Android and ended up with a few modifications (we needed to support old 28 | Android versions which have not a full support of Java SDK). 29 | 30 | In order to test performance, I created a small "demo" app: CitiesSuggest, a 31 | mobile application based on Geonames database to look for a city name. I 32 | filled the index with all places with a known population. In the end, the 33 | database contained 270 000 city names. 34 | 35 | As could be expected, the resulting application was quite sluggish on my 36 | Galaxy S2. The worst queries could take more than one second of CPU. 37 | 38 | I then applied all possible methods described in the [Anroid 39 | documentation][3] 40 | and was able to reduce the response time to 700ms for the longest queries. 41 | This is better but still gives end-users an impression of sluggishness! 42 | Fortunately, common queries worked well enough to present our very first demos 43 | at [LeWeb'12 London][4]. I was subsequently able to improve the user experience a lot 44 | by adding asynchronous support. At that point, we decided to start 45 | implementing the objective-C version for iOS. 46 | 47 | I started a new implementation fully done in objective-C from scratch without 48 | any premature optimization. I then developed the same CitiesSuggest 49 | application for iOS. I first got stuck with some basic UI stuff. For example I 50 | needed to reimplement an UILabel that supports highlighting! The standard 51 | UILabel does no support this, and other implementations like Three20 just have 52 | too many dependencies (you can download AlgoliaUILabel on 53 | [github][5], I released  the code under Apache 54 | licence). Once the UI was ready, I could see the actual performance was 55 | catastrophic! Instant suggest queries were between 200ms and 10 seconds on an 56 | iPhone 4S! 57 | 58 | After profilling, I discovered that 95% of the time was spent in Objective-C 59 | messaging and ARC. Actually, I have millions of calls to very small methods 60 | with 1 or 2 lines of code, and I found a very good explanation in the internal 61 | of objc_msgSend (mainly on [mikeask.com][6]. There is in fact a hash table 62 | lookup behind objc_msgSend! This explains most of my performance problems. 63 | 64 | To fix these problems, I started to replace all this low level objective-C 65 | implementation by a C++ implementation with inlined methods. Eventually, I 66 | finished with Objective-C code for high level classes while all the core was 67 | C++. 68 | 69 | This change has dramatically improved performance with instant-search queries 70 | between 2ms and 90ms on a iPhone 4S. I struggled to find complex enough 71 | queries to reach 90ms! This resulted in a very nice user experience with a 72 | remarkably slick demo :) 73 | 74 | After this succes, I decided to use the same C++ code on Android with Android 75 | NDK. With this approach I reduced our maximum query time from 700ms to 80ms on 76 | a Galaxy S2. But I was really disappointed by the Android display, as I did 77 | not reach the same level of interactive experience that I had with iOS. The 78 | display of results stays slower on Android, probably because I did not spend 79 | enough time to optimize this part. 80 | 81 | In the end, I lost a lot of time with Java and Objective-C trying to optimize 82 | code when the real solution was to use C/C++. I am fully convinced that it is 83 | just not possible to reach the same speed with Objective-C only or Java only. 84 | 85 | And there is also another good property with C++ code: Blackberry supports 86 | C++, and there is large chance that Windows Phone 8 SDK will support C++ when 87 | released in a few weeks. Actually, I do not see any other alternative than 88 | C/C++ when you are looking for performance on mobile devices, which is our 89 | case :) 90 | 91 | I hope this article will prevent you from spending as much time on 92 | Java/Objective-C optimizations as I did. 93 | 94 | 95 | [1]: http://redd.it/136hny 96 | [2]: http://www.algolia.com 97 | [3]: http://developer.android.com/guide/practices/performance.html 98 | [4]: http://blog.algolia.com/great-discussions-at-leweb12-london/ 99 | [5]: http://github.com/algolia/UILabel 100 | [6]: http://www.mikeash.com/pyblog/friday-qa-2009-03-20-objective-c-messaging.html) 101 | -------------------------------------------------------------------------------- /_posts/2012-08-01-free-marketing-wwdc2012.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Free marketing @ WWDC 2012! 4 | author: Nicolas 5 | --- 6 | 7 | Let's rewind time a bit. Back in June was the famous Apple Developer 8 | Conference, aka WWDC 2012. Algolia didn't even have a website at that time, 9 | but what we did have is a friend who would attend: 10 | [Thomas][1]! That was an occasion we could not 11 | pass! 12 | 13 | Thomas agreed to speak about us a bit and to invite people to visit our 14 | website. That simple action defined our deadline to have a website up and 15 | running. But wait! That would be better if people could also find the site 16 | when Googling our company name. That meant a few days to allow for indexing... 17 | and a tight deadline! 18 | 19 | About two weeks of brainstorming and implementation went into the [web 20 | site][2]. Our goal was to have a clear presentation of 21 | our mobile search lib... and to be found on Google! And you know what? It's 22 | damn difficult to do so in so short a time! Our site was up and running two 23 | days before the conf and we immediately submitted it to all search engines. 24 | Unfortunately we were not in first position when Googling for Algolia :( 25 | 26 | Fortunately, things improved without delay. Two actions were particularly 27 | useful in helping our search rankings: our participation to the [Evernote 28 | DevCup][3], 29 | and our blog opening! We quickly got the pole position for our brand and 30 | started to rank well for some key queries like [mobile instant 31 | suggest][4] :) 32 | 33 | We also thought about creating some posters that explain our technology, but 34 | eventually we were so concentrated on the web site that we passed. 35 | 36 | Result: Some awareness, one subscription to beta and more importantly, a 37 | running website! Next marketing related action would be to have a demo ready 38 | for LeWeb in London, but that's [another story][5]... 39 | 40 | And here is what you could see on WWDC whiteboards: 41 | 42 | [![WWDC Message 1][6]](https://blog.algolia.com/wp- 43 | content/uploads/2012/07/wwdc1.jpg) 44 | 45 | [![WWDC Message 2][7]](https://blog.algolia.com/wp- 46 | content/uploads/2012/07/wwdc2.jpg)Thank you again for your help Thomas! 47 | 48 | 49 | [1]: https://twitter.com/sarfata/ 50 | [2]: http://www.algolia.com 51 | [3]: http://blog.algolia.com/were-participating-to-the-evernote-devcup/ 52 | [4]: https://www.google.com/search?q=mobile+instant+suggest 53 | [5]: http://blog.algolia.com/great-discussions-at-leweb12-london/ 54 | [6]: ./assets/wwdc1.jpg 55 | [7]: ./assets/wwdc2.jpg 56 | -------------------------------------------------------------------------------- /_posts/2012-08-16-algolia-search-beta-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search beta is out! 4 | author: Nicolas 5 | --- 6 | 7 | [![][1]](https://blog.algolia.com/wp- 8 | content/uploads/2012/08/searchForEvernoteSmall.png)After a few months in the 9 | making, our first mobile library is finally ready to hit the shelves! Well, 10 | nearly! Before releasing it, we want all the feedback you can give us to 11 | ensure it's bug-free, easy to use and responsive to your needs. 12 | 13 | If you subscribed to the beta, you should already have received your access 14 | info. If not, you can request it directly on www.algolia.com. 15 | 16 | You'll be able to download both the iOS and the Android versions, along with 17 | all necessary documentation. Feel free to ask for any clarification or 18 | additional info. We'll do a few technical posts which explore the product 19 | internals in the coming months. 20 | 21 | We're now eager to read your feedback! You just have one address to remember 22 | to report bugs, request features, or anything beta related: beta@algolia.com 23 | 24 | Enjoy! 25 | 26 | 27 | [1]: ./assets/searchForEvernoteSmall.png 28 | -------------------------------------------------------------------------------- /_posts/2012-08-22-results-of-the-evernote-devcup.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Results of the Evernote DevCup 4 | author: Nicolas 5 | --- 6 | 7 | Time flies! I just realized we didn't offer any feedback about our 8 | participation in the Evernote DevCup back in July. 9 | 10 | First of all, thank you so much for your support! We ranked 14th out of 174 11 | contestants in public voting! That actually exceeded our expectations as we 12 | aimed for the 20th position (so drinks are on Julien!) 13 | 14 | But even with all of your support, we didn't make it to the finals. We would 15 | have loved to fly to San Francisco, but the [six 16 | finalists][1] all feature rich apps that merit their position. Congrats 17 | guys, and good luck! The conference is in a couple of days now, and I can't 18 | wait to find out who will win the cup! 19 | 20 | As for us, it was a truly great experience! Remember our 21 | [post][2] 22 | announcing our participation? Well, outside the *slight* frustration of not 23 | going to SF, the couple of days we spent building the Search for Evernote app 24 | was really worth it! 25 | 26 | * We were able to correct a few corner case bugs which this new use case highlighted. It's always better to find them yourself than let app developers stumble upon them :) 27 | * We developed a new feature enabling prefix search on all words. 28 | * Our participation led to an improved awareness of the company and helped our SEO. 29 | * We created a new demo of the search lib which is much more compelling than Cities Suggest in many situations. It is actually a bit more than a demo for some people - as of today, it has 317 active users on google play! 30 | 31 | That got us thinking... we may do this kind of contest again. But this time 32 | we'll aim higher! 33 | 34 | 35 | [1]: http://blog.evernote.com/2012/07/27/announcing-the-2012-evernote-devcup-finalists/ 36 | [2]: http://blog.algolia.com/were-participating-to-the-evernote-devcup/ 37 | -------------------------------------------------------------------------------- /_posts/2012-09-03-algolia-search-beta-2-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search Beta 2 is out! 4 | author: Julien 5 | --- 6 | 7 | We are pleased to announce the launch of Algolia Search Beta 2, our second 8 | release! 9 | 10 | We would like to sincerely thank all of our beta testers for the great 11 | feedback. You really helped us to make Algolia Search a first-class product 12 | guys! Please continue your feedbacks! 13 | 14 | And here what's new in this beta2. 15 | 16 | **iOS & Android changes:** 17 | 18 | * Improved performance for big data sets (up to three times faster). In our tests, we successfully used a 3 millions entries data set on a old iPhone 3GS. The index was 250MB large! 19 | 20 | **Documentation changes:** 21 | 22 | * Reworked the overview 23 | * Fixed a lot of typos and small errors 24 | 25 | **iOS specific changes:** 26 | 27 | * Added an AlgoliaSearch.h header that includes all public headers 28 | * Prefixed all public classes by AS 29 | * Changed addEntry selector in ASIndexWriter to be more similar to NSMutableDictionary API 30 | * Removed internal objects from public headers 31 | * Changed ASAsyncIndexSearcher API to implement the delegate pattern 32 | 33 | 34 | -------------------------------------------------------------------------------- /_posts/2012-09-24-algolia-search-beta-3-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search Beta 3 is out! 4 | author: Julien 5 | --- 6 | 7 | [![Algolia Search Beta 3][1]](https://blog.algolia.com/wp- 8 | content/uploads/2012/09/CitiesSuggestIOSPortraitSmall.png)We are pleased to 9 | announce Algolia Search Beta 3, our third release with a strong focus on 10 | performance. 11 | 12 | As for the previous release, we would like to sincerely thank all of our beta 13 | testers for their excellent feedbacks! 14 | 15 | Here what's new in this beta3. 16 | 17 | 18 | **iOS & Android changes:** 19 | 20 | * **Ultra fast loading**: indexes are now loaded in a few milliseconds (always less 21 | than 10ms!)  With the Beta 2, an index of 500MB could take up to 20 seconds to 22 | load. 23 | 24 | * **Ultra fast search on big indexes**: Beta 2 was able to search up to 100k entries 25 | in real time. Beta3 can search in **5M entries in real time** (and probably 26 | 27 | more!). Our main use case was to search in all titles of the English version 28 | of 29 | 30 | Wikipedia on a IPhone 3GS. The speedup is also very nice for small datasets, 31 | 32 | the near-zero CPU usage increases battery life compared to Beta 2. 33 | 34 | * Highlight is now always done on longest match. In previous version a query 'anq' could highlight "Angeles" in 35 | two different ways: "**Ang**eles" or "**An**geles", with this version you will 36 | always obtain "**Ang**eles" which is easier to 37 | 38 | understand for end-users. 39 | 40 | * Improved proximity scoring when a query contains multiple words. 41 | * Fixed two memory leaks that could lead to problems with very heavy usage. 42 | 43 | **iOS specific changes:** 44 | 45 | * Added a version without ARC that allows to target iOS >= 3.0 46 | 47 | 48 | [1]: ./assets/CitiesSuggestIOSPortraitSmall-155x300.png 49 | -------------------------------------------------------------------------------- /_posts/2012-09-28-upcoming-events-appsworld-mobility-for-business-appdays.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Upcoming Mobile App Conferences: Apps World, Mobility for Business, Appdays' 4 | author: Nicolas 5 | --- 6 | 7 | With the summer behind us, the period is pretty active. It's really difficult 8 | to attend all the great events, big and small, organized out there. After 9 | [Mobile Monday][1], 10 | [Failcon][2] and the first meeting of 11 | [Appsterdam][3] Paris this week, here are the major mobile 12 | app conferences we're attending in the next few weeks! 13 | 14 | * [Appsworld][4], the 2nd and 3rd of October in London. It's a major event attended by lot of mobile industry professionals. There are expecting up to 5000 participants! 15 | * [Mobility for business][5], the 11th and 12th of October in Paris. A big event too, they are expecting about 3000 attendees! 16 | * [Appdays][6], the 9th of November in Paris. A more human sized event (200 participants) and definitely a place to be! 17 | 18 | If you happen to participate to one of these, get in touch for some passionate 19 | discussion around mobile apps development! 20 | 21 | 22 | [1]: http://www.mobilemondayfrance.org/ 23 | [2]: http://france.thefailcon.com/ 24 | [3]: http://appsterdam.rs/ 25 | [4]: http://www.apps-world.net/europe/ 26 | [5]: http://www.mobility-for-business.com/ 27 | [6]: http://appdays.fr/ 28 | -------------------------------------------------------------------------------- /_posts/2012-10-07-a-few-thoughts-after-apps-world.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: A few thoughts after Apps World 4 | author: Nicolas 5 | --- 6 | 7 | Last week provided me with an occasion to feel the tempo of the mobile 8 | ecosystem at Apps World in London. Here are a few thoughts about what I saw. 9 | 10 | ![][1]There were many many mobile agencies 11 | exhibiting... and local UK agencies were dwarfed in number by offshore ones, 12 | hailing mainly from India. Eastern European countries also had an important 13 | presence, especially Poland. It seems that the golden days of apps development 14 | are behind us. Most big companies now outsource their apps offshore. It also 15 | means that it's becoming very important for local agencies to differentiate 16 | themselves. I actually pitched many of them about Algolia Search and 17 | differences in reactions were interesting. Most Indian based agencies didn't 18 | have a second look; They preferred to wait for "requirements" from their 19 | customers. On the other hands European ones were on average much more 20 | interested in what they could do with such a lib. The most geniune interest 21 | always came from technical guys when they were present. By the way, if I could 22 | give advice to any agency participating in such a event, please come with at 23 | least a developer, and at best your CTO. You would gain much credibility and 24 | differentiation! 25 | 26 | Out of all of the agencies, a few other disciplines were well represented... 27 | actually I may say "too much" represented as it often indicates an over- 28 | crowded field and a battle for survival! 29 | 30 | * **Testing and QA services**. Offshore Indian firms are also very active in this space. 31 | * **Ad platforms and payment tools**. I didn't know there were so many options to choose from! Competition seemed harsh to get the attention of the few apps developers attending. 32 | * And most of all **cross-platform HTML5 frameworks**! I'm not a big fan of PhoneGap and consorts, even if I admit it's a good choice for some apps, especially "enterprise" ones. The space is so crowded with offers now, that many may not survive the next year! By the way if you want to offer a framework and want to differentiate yourself with a cutting-edge search functionality, you know how to contact me ;) 33 | 34 | ![Blackberry at Apps World][2] 35 | 36 | Two companies had a particularly important presence at the event compared to 37 | what we could have expected: 38 | 39 | * **RIM**, with probably the nicest booth of all. They proposed BlackBerry porting classes, offered developer guidance and gave several workshop speeches. After their recent commitment to [paying BlackBerry 10 developers a minimum of $10K][3], they continue to do all they can to attract developers. But I'm afraid I agree with Charlie Kindel that [paying developers is a bad idea][4]! 40 | * **Twilio**, actively promoting their voice and SMS APIs. Their immense success reminds us that there are still billions of feature phones out there! 41 | 42 | The other less surprising major players included Samsung and Microsoft, but no 43 | Google and no Apple (not unexpected!). Of course, they were present in many 44 | conversations! I had for example a very interesting chat with [Adam 45 | Hościło][5] about the many opportunities provided by the 46 | new iOS 6 Passbook. It's opening a golden area for many in the next few 47 | months! 48 | 49 | 50 | [1]: ./assets/appsworld-300x224.jpg 51 | [2]: ./assets/blackberry-300x224.jpg 52 | [3]: http://devblog.blackberry.com/2012/09/built-for-blackberry-10k-developer-commitment/ 53 | [4]: http://ceklog.kindel.com/2012/09/26/paying-developers-is-a-bad-idea/ 54 | [5]: http://twistedhq.com 55 | -------------------------------------------------------------------------------- /_posts/2012-10-19-painless-integration-crystal-clear-documentation-please-welcome-algolia-search-beta-4.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Painless integration, crystal clear documentation, please welcome Algolia Search 4 | beta 4! 5 | author: Nicolas 6 | --- 7 | 8 | [![][1]](https://blog.algolia.com 9 | /wp-content/uploads/2012/10/CitiesSuggestIPhone5Slide3.png) 10 | 11 | Last month has been truly electrifying! We joined our friends at 12 | [Yakaz][2] in their office space, we participated in many 13 | events... and most exciting of all, we spent days and nights reworking the 14 | product! Today we are really proud to present you the result of this time well 15 | spent! 16 | 17 | I know I told some of you beta3 would be the last, but we could not ignore 18 | your excellent feedback. So here comes Algolia Search beta4, a true revolution 19 | (I hope this is not trademarked!) in mobile search! 20 | 21 | Here come the major improvements: 22 | 23 | * A completely **reworked API** that we just love to use everywhere. The time to fully understand the library has been reduced to nearly nothing thanks to all your feedback. We are proud to have the easiest to use search library ever made! 24 | * A completely **rewritten documentation** with detailed API and step-by-step tutorials. You should be able to make your first queries in a matter of minutes! 25 | * **Easy highlight** for **multiple fields queries**. A bit cryptic? Stay with me... just imagine a Contact application where you can search for your contact by any field, i.e., name, company, address or even notes. Algolia Search now provides easy-to-use highlighting of any matching words. It is even able to generate a snippet when the text is too long. Check out the tutorials to learn more! Highlighting relevant results just became child's play! 26 | * A greatly **improved out-of-the-box relevance**. Our mission is to simplify search: we want the best possible relevance by default so you can forget these long hours of tuning :) 27 | 28 | But that's not all, many smaller improvements were also included in this 29 | release: 30 | 31 | * Support of **advanced queries**. Take again our tutorial contact application, wouldn't it be great to be able to search by initials? You can now implement this cool feature in a couple of minutes without any headache on relevance tuning. 32 | * Support for **ARC and no ARC**. In the previous beta we added an iOS version for people that do not use [Automatic Reference Counting (ARC)][3]. We now have only one version that supports projects with and without ARC. If you do not use ARC, all objects received from Algolia Search are autoreleased. 33 | * Support for **user objects backward compatibility**. As the index is also an objects store, you can modify your object members and still read older indexes! It is very easy to implement, just check the tutorials. 34 | * The release also fixes a few bugs that we discovered during your and our intensive testing. 35 | 36 | It would not have been possible without the help of our many beta testers, 37 | thank you all! Special thanks to [Kris][4], 38 | [Hoa][5] and 39 | [Thomas][6] whose guidance has been priceless. 40 | 41 | So... what's next? Many things! This time I really believe this is the last 42 | beta. The final release is just around the corner. Of course, we appreciate 43 | your feedback nonetheless and always will! You can also expect a new website 44 | and a few apps in the app store! Who said a contact app? 45 | 46 | Stay tuned! 47 | 48 | 49 | [1]: ./assets/CitiesSuggestIPhone5Slide3-300x194.png 50 | [2]: http://www.yakaz.com/ 51 | [3]: http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html 52 | [4]: https://twitter.com/krmarkel 53 | [5]: https://twitter.com/dinh_viet_hoa 54 | [6]: https://twitter.com/sarfata 55 | -------------------------------------------------------------------------------- /_posts/2012-11-12-the-ordeal-of-obtaining-an-apple-developer-professional-account.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: The Ordeal of Obtaining an Apple Developer Professional Account 4 | author: Julien 5 | --- 6 | 7 | I recently had a pretty bad user experience when I upgraded my personal Apple 8 | developer account into a professional one. 9 | 10 | To sum things up, we officially created Algolia in early October and I decided 11 | to convert my personal Apple Developer Account in order to have our 12 | applications published under the "Algolia" name. This process is not available 13 | online, but after a quick call, people at Apple sent me the link for the 14 | process. It is actually pretty simple: They just need you to fill some 15 | information about your company and to accept their EULA. 16 | 17 | Well, actually some of this information was pretty obscure. They needed our 18 | D-U-N-S® number... Some time ago, Apple was doing the job of checking that 19 | your company is a real one, but they decided to delegate this job to an 20 | external company (D&B). It looks like a good idea, doesn't it? After all this 21 | is not their core competency and D&B may be doing a really good job for this 22 | task... 23 | 24 | The short answer is no, it wasn't a good idea at all! I started to check how 25 | to get this famous D-U-N-S® and after some time to understand the antiquated 26 | website of D&B, I finally found the contact address. One week later I finally 27 | received our D-U-N-S®. But that's not all, Apple then asked us to wait for the 28 | synchronization between D&B and Apple... which can take up to 14days! 29 | 30 | Hey guys, I don't know if you realize how this is ridiculous to wait 14 days 31 | for a simple database synchronization! You have just no idea what 14 days 32 | means for a young startup :) 33 | 34 | As you can imagine, I was already quite frustrated... but this was just the 35 | beginning. After the 14 days, Apple recognized the DUNS number... but a field 36 | was missing. They didn't have the legal type of our company. They then asked 37 | me to contact D&B and a new nightmare started at this level: D&B was saying 38 | that the entry was correct while Apple was asking me to contact D&B to correct 39 | the entry! There's nothing worst than to stand be between two big companies 40 | who pass the buck to each other. 41 | 42 | Hopefully Apple was far smarter than D&B and they finally accepted to bypass 43 | the missing field if I sent them directly our legal documents. 44 | 45 | It is crucial to pay attention to all your users' problems and solve them as 46 | soon as possible. They may sometimes look like details to you, but that's what 47 | your customers will remember about your company. Of course, we try to apply 48 | this lesson to ourselves. Feel free to tell us if something's going wrong! 49 | 50 | 51 | -------------------------------------------------------------------------------- /_posts/2012-11-21-algolia-search-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search is Out! 4 | author: Nicolas 5 | --- 6 | 7 | Test!!!!... 8 | 9 | 10 | This release also means that you can now integrate it directly into your apps 11 | and publish them! We wanted to have a simple and clear pricing plan: You can 12 | have all the benefits of Algolia Search in one Android or iOS App for only 13 | $590! Think about it, that's less than the day-rate of a mobile developer in 14 | many countries. Compare it to the many days you would need to integrate SQL 15 | Lite FTS for poor features. 16 | 17 | [Try Algolia Search for free][4] for 30-days! 18 | 19 | We are also very excited to introduce our new 20 | [website][5] alongside this launch. You'll be able to 21 | access up-to-date documentation easily, to [try and 22 | download][6] Algolia Search in a few clicks and, of 23 | course, to order the product! Check it out and let us know what you think! 24 | 25 | Thanks again to our beloved beta testers. Stay tuned for more news! 26 | 27 | 28 | [1]: ./assets/hand-203x300.jpg 29 | [2]: http://www.algolia.com/product/ 30 | [3]: http://www.algolia.com/?video=1 31 | [4]: http://www.algolia.com/try/ 32 | [5]: http://www.algolia.com 33 | [6]: http://www.algolia.com/try/ 34 | -------------------------------------------------------------------------------- /_posts/2012-11-29-why-autocomplete-in-twitter-on-mobile-sucks.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Why Autocomplete in Twitter Mobile App Sucks 4 | author: Julien 5 | --- 6 | 7 | [![A better Twitter mobile app experience with Algolia 8 | Search.][1]](https://blog.algolia.com/wp- 9 | content/uploads/2012/11/ScreenshotTwitter.png)Autocomplete is so 10 | intuitive,that it seems like it would be easy to implement. However, most 11 | mobile apps that offer it provide a pretty poor user experience. Let's look at 12 | the Twitter mobile app as an example. 13 | 14 | Twitter proposes autocompletion when you create a new tweet. The idea is to 15 | make suggestions after the '#' and '@' characters. It's actually very nice to 16 | gain time, especially when you're tweeting with a small virtual keyboard... 17 | but it sucks! 18 | 19 | ## Avoid Roundtrips to Server for Autocompletion 20 | 21 | The first reason is that when you're on the go, latency is often too high on 22 | mobile, leading to unusable autocomplete -  except if you're very slow to 23 | type. Twitter developers chose to develop this functionality server-side, 24 | probably with lucene, and to expose it via APIs to their mobile app. That's 25 | good for reusability but not so much for usability... 26 | 27 | ## Beware of the Suggestions Ranking 28 | 29 | The second reason is the ranking is just obscure. Yesterday I sent a tweet to 30 | @cocoanetics and the screenshot on the left shows the suggestions I got when 31 | typing "@c". I would greatly prefer to see Twitter handles before names and it 32 | would never come to my mind to look for "Marie Cecile" with "@c"! 33 | 34 | ## Explain the Matches 35 | 36 | Last but not least there is no visual feedback to show me why the app proposes 37 | a given user. So ok let me think... the 'c' was reffering to "Cécile" in 38 | "Marie-Cécile"! A bit far fetched! 39 | 40 | Now let's imagine the Twitter mobile app with instant autocompletion even 41 | offline, intuitive ranking, and visual feedback... Appealing, isn't it? 42 | Twitter if you listen, check it up, I'm sure you'll love [Algolia 43 | Search][2]! 44 | 45 | 46 | [1]: ./assets/ScreenshotTwitter.png 47 | [2]: http://www.algolia.com/product/ 48 | -------------------------------------------------------------------------------- /_posts/2012-11-30-we-are-seedcamp-finalists.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: We are SeedCamp Finalists! 4 | author: Nicolas 5 | --- 6 | 7 | Hey, we are thrilled to announce our nomination among the [Seedcamp Paris 8 | finalists][1]! The event will take place next week on Monday, 9 | just before [LeWeb 2012][2] (by the way we'll be there, 10 | feel free to ping us if you'd like to meet). 11 | 12 | ![Seedcamp Finalists][3] 13 | 14 | From what we learned from all over the place, the day's mentorship alone is 15 | worth it. We're now fully committed to the event preparation! I'll try to 16 | write a followup post with our impressions. 17 | 18 | [Edit 15-Jan-2013] Here it is with some [tips and 19 | advice][4] 20 | [/Edit] 21 | 22 | 23 | [1]: http://www.rudebaguette.com/2012/11/30/here-are-the-20-startups-selected-for-seedcamp-paris/ 24 | [2]: http://paris.leweb.co/ 25 | [3]: ./assets/seedcamp.png 26 | [4]: http://blog.algolia.com/seedcamp-tips-and-advice-from-a-finalist/ 27 | -------------------------------------------------------------------------------- /_posts/2012-12-13-our-smart-contacts-demo-hits-the-app-store.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Smart Contacts Demo Hits the App Store! 4 | author: Nicolas 5 | --- 6 | 7 | After going back and forth a few times with Apple, we are really happy to 8 | announce the availibility of our [Smart 9 | Contacts][1] 10 | application on the App Store! Even if we built it to demonstrate the amazing 11 | features of our search technology SDK, it can be used as an in-place 12 | replacement of the traditional iPhone Contacts app. Check it up! 13 | 14 | [![Smart Contacts demo hits the App Store][2]](https://itunes.apple.com/gb/app/algolia-smart- 15 | contact/id583433043) 16 | 17 | ## Outstanding Search Features 18 | 19 | It plugs directly into your iPhone contacts and classically allows you to 20 | update them or create new ones. What's more interesting is the Search 21 | integration! It features:[![Smart Contacts Screenshot][3]](https://blog.algolia.com/wp-content/uploads/2012/12 22 | /SmartContact-iphone5.png) 23 | 24 | * **Instant search** with autocompletion and **visual feedback** as you type 25 | * Search on **all contacts attributes** (name, company, notes, etc.) 26 | * **Typo tolerance** to account for smartphone small keyboards 27 | * And even **search by initials**! 28 | 29 | ## iOS API Limitations 30 | 31 | There are a few of features we would have loved to integrate that were not 32 | possible due to limitations in iOS APIs: group management, in place 33 | replacement of contacts in the phone app (that's maybe a lot to ask!), and 34 | ranking based on contact popularity. 35 | 36 | ## Free your Imagination! 37 | 38 | If you ever wanted to see Algolia Search in action, now is the time. Check it 39 | up with your own data and imagine what Algolia can do for the application you 40 | develop! 41 | 42 | And don't forget your 5 stars ranking ;) 43 | 44 | 45 | [1]: https://itunes.apple.com/gb/app/algolia-smart-contact/id583433043 46 | [2]: ./assets/available-on-iphone-app-store-logo.png 47 | [3]: ./assets/SmartContact-iphone5-489x1024.png 48 | -------------------------------------------------------------------------------- /_posts/2012-12-20-windows-8-beta-is-out-algolia-search-now-available-for-microsoft-desktops-and-tablets.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search is now in Beta for Microsoft Windows 8 Desktops and Tablets 4 | - The Algolia Blog 5 | author: Nicolas 6 | --- 7 | 8 | You may have been expecting Windows Phone 8 as our next platform of choice, 9 | but we preferred to go Windows 8 first! With more than 40M sold in a month, 10 | let's say it's a slightly more interesting market for now. 11 | 12 | ## Windows 8: Our First Move to the Desktop 13 | 14 | Yes, desktop apps are not as dead as many people think, especially now that 15 | both Mac OSX and Windows come with their app stores. Sure, Windows is now 16 | running on tablets - and we also support them - but it will take time before 17 | they surpass desktops. 18 | 19 | What's more, the new Windows 8 Metro Modern UI includes a charm bar 20 | with search and autocompletion as the number one feature. Microsoft actually 21 | provides an interface to ease application integration in the charm search 22 | bar... but no library to help you implement it. No problem, here comes Algolia 23 | Search for Windows 8! 24 | 25 | ## Awesome Features for Your Apps 26 | 27 | The core technology is exactly the same as the one in our iOS and Android 28 | versions. That means you'll get exactly the same exceptional performance... 29 | well probably even better depending of the hardware you're running on. You'll 30 | also get instant visual feedback, typo-tolerance and multiple attributes 31 | support! See all the features on our 32 | [website][1]. 33 | 34 | ## Easy to Integrate in your Language of Choice 35 | 36 | Check out the dedicated [tutorials][2]! The 37 | Algolia Search library has been designed to work directly on the platform. 38 | That means you can use it in whatever language you prefer, be it JS or one of 39 | the .Net choices (C#, VB, C++). The tutorials are available in both JS and in 40 | C#. 41 | 42 | Moreover it is fully compatible with Microsoft **Search Contracts**. It just 43 | became child's play to integrate Search in your Windows app! 44 | 45 | ## Hey Microsoft, There are a Couple of Features You Could Improve 46 | 47 | Windows 8 is clearly a step in the right direction, but we encountered some 48 | problems we didn't expect! 49 | 50 | First is the multi-arch support. While it's just straightforward with iOS or 51 | Android (out of the JNI part...), using a native lib forces the developer to 52 | chose an architecture on Windows! Fortunately, Visual Studio Package Generator 53 | handles that correctly and proposes you to select all architectures for your 54 | final export. But well... we'd have preferred it plain and simple. 55 | 56 | Our second deception is a bit more problematic as it prevents one of our very 57 | nice features: typo-tolerant highlighting during autocompletion. It starts 58 | with best of intentions from Microsoft. To remove the burden of implementing 59 | highlight for autocompletion on developers, Windows 8 handles it directly. The 60 | only problem is that it cannot be replaced by our own :( So you can obtain 61 | hits even if your query contains typos, but hits containing text different 62 | from the query won't be highlighted. 63 | 64 | We hope to be able to change this behaviour in the future. In the meantime, 65 | we're impatient to get your feedback on this beta! 66 | [Register][3] for your Windows 8 version of Algolia 67 | Search now! 68 | 69 | 70 | [1]: http://www.algolia.com/product/ 71 | [2]: http://www.algolia.com/doc/win8/ 72 | [3]: http://www.algolia.com/try/ 73 | -------------------------------------------------------------------------------- /_posts/2012-12-21-never-ever-hinder-the-use-of-your-products.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Never, Ever, Hinder the Use of your Products! 4 | author: Julien 5 | --- 6 | 7 | One of the worst user experiences I have ever had with software was with the 8 | Sony PS3. I kind of liked this product; I found the user interface very nice 9 | and well organized... but they were much too aggressive about upgrades! They 10 | simply blocked features until the upgrade was done! 11 | 12 | A few weeks ago I wanted to watch a VOD movie with my wife. I launched the 13 | Playstation Store that asked me to upgrade the OS to the latest version. 14 | That's **45 minutes** before being able to access the Playstation again! But 15 | wait! Once the new OS was installed, I tried to launch  the Playstation Store 16 | again... This time, it was the Playstation Application that was not up to date 17 | ! 18 | 19 | In total it took me over **1 hour** to do upgrades and guess what, at the end 20 | it was just too late to watch the movie! 21 | 22 | Generally, frequent upgrades are good for your users, and I am sure there are 23 | plenty of bug fixes/improvments in the lastest version. But Sony has just made 24 | the wrong choice in blocking features until the upgrade is done. This is just 25 | plain frustrating for users! On the contrary, Android and iOS propose an 26 | upgrade that you can apply when you want. Best of all, they download in the 27 | background. 28 | 29 | It may sound evident, but it is very important to ensure your users will 30 | always be able able to keep control over their products. You should never 31 | force them to do something they do not want to, like Sony did with the PS3. 32 | 33 | 34 | -------------------------------------------------------------------------------- /_posts/2012-12-28-simplicity-is-the-most-complex-feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Simplicity is the most Complex Feature! 4 | author: Julien 5 | --- 6 | 7 | I've been convinced for a long time that simplicity is the most important 8 | property of a product. Long-gone are the 90s when a product was admired for 9 | its complexity. But I am also convinced that this is the most complex property 10 | to achieve and maintain as time passes by. 11 | 12 | A good example of an over-complex product is Atlassian JIRA, a bug tracker 13 | that also do scrum management and plenty of other things via dozens of 14 | plugins. It's basically a toolbox to create the bug tracker adapted to your 15 | company. 16 | 17 | In my previous job, I faced an uncomfortable situation with JIRA because of 18 | its complexity. We used it for bug tracking and scrum management and I tried 19 | to upgrade our old version to the latest one. After some long hours to upgrade 20 | our setup on a test server, I finally got the latest version working but most 21 | of our installed plugins were not available anymore because the authors did 22 | not port their plugins to the new plugin API. Of course each plugin was there 23 | for a reason and I was in a tricky situation: keep the old version with 24 | security issues or upgrade to a new version without our plugins. 25 | 26 | But it was far more vicious: There were about 10 versions between our old 27 | version and the latest one, and I didn't find any of these versions working 28 | with our set of plugins! In the end, we were forced to keep our old version. 29 | 30 | Atlassian forgot the most important lesson, even with a toolbox: simplicity! 31 | This is probably more expensive for them to keep plugin backward 32 | compatibility, but I would prefer for them to not have any plugin rather than 33 | breaking compatibility at each release. The final system is too complex to be 34 | maintainable and our final decision was to stop paying for JIRA support since 35 | we were blocked with an old release. It is even bad for their business. 36 | 37 | You should be focused on simplicity for your users even it this results in 38 | more complexity for you (like maintaining backward compatibility)! As this 39 | post is strongly related to backward compatibility of API, I encourage you to 40 | reread this famous post of Jeol Spolsky: [How microsoft lost the API 41 | war][1]. 42 | 43 | 44 | [1]: http://www.joelonsoftware.com/articles/APIWar.html 45 | -------------------------------------------------------------------------------- /_posts/2013-01-24-why-android-apk-format-is-a-terrible-mistake.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Why Android APK Format is a Mistake 4 | author: Julien 5 | --- 6 | 7 | When I started to develop for Android it appeared to me that an APK file was 8 | just an archive, a simple approach that you can find in many systems today. 9 | Files are extracted from the archive at installation and you can access them 10 | via the file-system. 11 | 12 | This seemed even more reasonable since Android uses Linux which is very good 13 | in respect to POSIX standards. 14 | 15 | But I was completely wrong! An APK is not a mere archive: the application 16 | starts from and uses the APK at runtime! This is a horrible decision that will 17 | probably hurt Android for a long time... 18 | 19 | **[Edit 28-Jan-2013]** The goal of this post was to express my point of view about the bad properties of using directly the APK file at runtime versus relying on the file system. I used memory-mapped file to illustrate this but the post is incorrect on that topic. There is in fact a way to memory-map a file directly from the APK: you can use an extension for which files are stored uncompressed inside the APK (mp3, jpg, ...) and use the `AssetManager.openFD()` or `Resources.openRawResourceFD()` to have offset/length inside the APK file. 20 | 21 | All my thanks to Jay Freeman for his excellent feedback. His comments helped 22 | me to understand my mistake and to improve our Android integration! 23 | 24 | **[/Edit]** 25 | 26 | ### What is the Problem with the APK format? 27 | 28 | Let's look at our own example. At Algolia, we have designed an efficient 29 | binary data-structure that is able to answer instant-search queries in just a 30 | few milliseconds, even with a very big data set (for example with all the 31 | world cities' names from Geonames: 3M+ entries). This data-structure is 32 | designed to be used directly on disk without being copied in memory. To obtain 33 | optimal performance, we use a [memory-mapped 34 | file][1] which is standard on 35 | all platforms, especially on Linux. 36 | 37 | We have been able to use memory-mapped files on all platforms, except on 38 | Android!  In fact you can only retrieve an InputStream from a file packaged in 39 | an APK. So the only solution to use a memory-mapped file is to copy the 40 | resource from the APK on disk and then to use the file-system. This seems like 41 | re-implementing an installer in each application. 42 | 43 | ### Is the APK so bad? Why did they design it this way? 44 | 45 | I imagine that Android developers chose this approach to solve some pitfalls 46 | of file-systems. I can think for example about solving performance problems 47 | when you have a lot of small files in one folder, or reducing the size of 48 | applications on the device (resources are compressed in the APK and 49 | decompressed only when the application uses them, which actually contributes 50 | to the sluggish image of Android). 51 | 52 | I may of course be wrong, there may be other more important reasons for this 53 | approach. But if not, Android should have thought more about the consequences 54 | of their choice: in the long term, the APK constraints are more serious than 55 | those small pitfalls that could have been solved in other ways. 56 | 57 | But wait... Android applications can contain dynamic libraries (.so files) via 58 | NDK. Isn't it the principle of dynamic libraries to be memory-mapped? In fact 59 | I am pretty sure they discovered this problem when working on NDK since 60 | dynamic libraries are automatically extracted from APK file at installation 61 | and stored in an application directory in '/data/data'. I am wondering why 62 | they decided to implement this hack instead of fixing the problem... 63 | 64 | ### Conclusion 65 | 66 | Developing an API, a SDK or worse, a whole platform, is extremely difficult. 67 | Let's face it, it's unavoidable to ship some badly designed components or 68 | inconsistent APIs. We definitely need to listen to developers' feedback even 69 | when it hurts. Actually, the real difficulty comes when it's time to put 70 | things right without alienating existing users! 71 | 72 | By the way, if you know more about APK design choices, I'm interested to hear 73 | from you! 74 | 75 | 76 | [1]: http://en.wikipedia.org/wiki/Memory-mapped_file 77 | -------------------------------------------------------------------------------- /_posts/2013-01-28-sharypic-benefits-from-algolia-search.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Sharypic benefits from Algolia Search! 4 | author: Nicolas 5 | --- 6 | 7 | Demonstrating how Algolia Search functions in the wild, in this post we will 8 | discuss a recent integration with [sharypic][1], another 9 | Paris-based startup focussed on photo sharing at events. 10 | 11 | Sharypic is a [web][2] and [mobile 12 | app][3] dedicated to collaborative photo sharing, focused on 13 | enabling users to easily gather photos from attendees during and after an 14 | event. The platform allows users to collect and share photos from all devices, 15 | including mobiles (via Twitter and Instagram), cameras, and computers, and 16 | from already existing albums on Facebook, Picassa, and Flickr. One of their 17 | killer features is the ability to stream photos to a live PhotoWall at the 18 | venue and to an embeddable slideshow widget. This increases engagement both 19 | with event attendees and with an online audience. On sharypic one of the 20 | primary ways that users discover events is via a search bar, in addition to 21 | pages highlighting recent and popular events. 22 | 23 | 24 | [![Sharypic][4]](http://blog.algolia.com/sharypic-benefits- 25 | from-algolia-search/sharypic/)The existing mobile search function relied on 26 | users accurately typing an event's name into the search field, which limited 27 | the results (especially on smartphones where typos are common). By integrating 28 | Algolia Search into the mobile app, sharypic users can now type just a few 29 | letters of a search term, or enter it incorrectly ('pqris' instead of 30 | 'Paris'), and the results will display the corrected term within event names, 31 | locations, descriptions, or hashtags. 32 | 33 | Martin Fourcade, one of sharypic's co-founders, said "For our users, it's 34 | exactly what we needed. They can show the best photos of their events to 35 | friends without bugging their smartphone and whining about the internet 36 | connection. I'm lazy when it comes to typing on my smartphone, impatient when 37 | it comes to waiting for server responses... now everything is done with a few 38 | keystrokes!" 39 | 40 | Sharypic's other co-founder François-Joseph Grimault hopes that this new 41 | intelligent search will enable users to find specific content more easily, 42 | possibly leading to increased exploration on the platform. Time will tell how 43 | the new search feature affects user behaviour, but reducing user frustration 44 | through quick and efficient search is a step in the right direction. 45 | 46 | _[Download][5] the latest version of the sharypic app, including 47 | integrated Algolia Search, and have fun with photo sharing at your next 48 | event!_ 49 | 50 | 51 | [1]: http://sharypic.com 52 | [2]: http://www.sharypic.com/ 53 | [3]: https://itunes.apple.com/us/app/sharypic-event-photo-sharing/id490922939?mt=8 54 | [4]: ./assets/Sharypic.png 55 | [5]: https://itunes.apple.com/us/app/sharypic-event-photo-sharing/id490922939?mt=8 56 | -------------------------------------------------------------------------------- /_posts/2013-01-29-we-ranked-second-at-start-in-paris.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: We ranked Second at Start In Paris! 4 | author: Nicolas 5 | --- 6 | 7 | [Start In Paris][1] is a monthly event where 5 8 | startups have the opportunity to pitch their service to the Paris startup 9 | community. After a first selection and then a public vote, we were selected as 10 | one of 5 finalists of the #22 edition that took place yesterday, January the 11 | 28th! 12 | 13 | ![Start In Paris][2] 14 | 15 | Algolia has greatly evolved over the last few months, so it was an excellent 16 | occasion for us to test a new pitch! And the response has truly exceeded our 17 | expectations. After a 5 minute pitch we received a rush of questions, 18 | displaying interest and insight from the 400-strong audience! 19 | 20 | While we were the only tech startup to pitch to an audience including only a 21 | few developers, we ranked second in votes, just behind [Kitchen 22 | Trotter][3], our fellow Seedcamp finalist from 23 | last December. Congrat to them, they were truly excellent! 24 | 25 | **[Edit 03-Feb-2013]** Check out [Alexis Niki][4] great feedback about the event on [Rude Baguette][5] **[/Edit]** 26 | 27 | [![Nicolas at Start In Paris][6]](https://blog.algolia.com/wp- 28 | content/uploads/2013/01/StartInParis.jpg) 29 | 30 | 31 | [1]: http://www.startinparis.com/ 32 | [2]: ./assets/StartInParis.gif 33 | [3]: http://www.kitchentrotter.com/ 34 | [4]: https://twitter.com/AlexisNiki 35 | [5]: http://www.rudebaguette.com/2013/02/01/three-storytelling-tips-for-french-startups-when-pitching/ 36 | [6]: ./assets/StartInParis-1024x768.jpg 37 | -------------------------------------------------------------------------------- /_posts/2013-02-19-meet-us-at-the-mobile-world-congress.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Meet us at the Mobile World Congress! - The Algolia Blog 4 | author: Nicolas 5 | --- 6 | 7 | We'll be in Barcelona next week for the Mobile World Congress! Last year, more 8 | than 67,000 attendees participated in the event. 9 | 10 | We will use this opportunity to launch our new website along with a brand new 11 | offer... Algolia for FREE! Stay tuned! 12 | 13 | If you happen to be attending MWC too, ping me if you'd like to discuss over a 14 | coffee :) (@dessaigne on twitter, or nicolas at algolia dot com). 15 | 16 | 17 | -------------------------------------------------------------------------------- /_posts/2013-02-19-round-table-at-microsoft-techdays-2013.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Round table at Microsoft TechDays 2013 4 | author: Nicolas 5 | --- 6 | 7 | I had the pleasure to be invited by [David 8 | Catuhe][1] to participate in a round table about 9 | Windows8 development during [Microsoft TechDays 10 | 2013][2]! 11 | 12 | I was joined by [Christopher Maneu][3] from Deezer and 13 | [Guillaume Leborgne][4] from 14 | MCNext, both deeply involved in Windows development. David (cropped from the 15 | photo) led the discussion with [Jean Ferré][5], who 16 | leads the developers, platform and ecosystem division at Microsoft France. 17 | 18 | The discussion was very interesting and openly addressed the late start of 19 | Microsoft on mobile. They seem to have spared no effort to ease the work of 20 | developers, for example by opening the platform to development in 21 | HTML5/Javascript. I confess I initially thought it was a strange choice for 22 | native apps but it seems to have attracted quite a few web developers. 23 | 24 | This round table was a great opportunity to meet smart people and gain insight 25 | into the Microsoft platform! Thanks also to the journalists in attendance who 26 | covered Algolia in the IT press. 27 | 28 | 29 | [1]: https://twitter.com/deltakosh 30 | [2]: http://www.microsoft.com/france/mstechdays/ 31 | [3]: http://blog.maneu.net 32 | [4]: https://fr.linkedin.com/pub/guillaume-leborgne/27/5b7/48 33 | [5]: http://www.microsoft.com/france/microsoft-en-france/microsoft-france/equipe-dirigeante/jean-ferre.aspx 34 | -------------------------------------------------------------------------------- /_posts/2013-03-12-algolia-search-is-now-available-for-free.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'FREE Search SDK: Algolia is Now Available for Free!' 4 | author: Nicolas 5 | --- 6 | 7 | Yes, you read that right! We're not talking about a free trial, but of a 8 | completely FREE version of our SDK. It is often difficult to implement a good 9 | search experience, so we want to democratize access to easy-to-integrate and 10 | first class search features! All you have to do is to display non-intrusive 11 | Algolia branding. 12 | 13 | This branded offer is already available on our website. Don't delay, [register 14 | today][1]! Check out our [use-cases 15 | section][2] to discover possible 16 | implementations and see how Sharypic, Offline dictionaries, and Sush.io have 17 | integrated Algolia in their apps. 18 | 19 | Help us spread the word. We want every app developer to be able to take 20 | advantage of this offer! 21 | 22 | 23 | [1]: http://www.algolia.com/get-started/ 24 | [2]: http://www.algolia.com/usecases/ 25 | -------------------------------------------------------------------------------- /_posts/2013-03-18-our-saas-version-is-in-beta.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Online Search in the Cloud: Version is in Beta!' 4 | author: Nicolas 5 | --- 6 | 7 | Imagine all the power and simplicity of Algolia Search, but available online, 8 | from any connected device. Welcome to our Cloud! 9 | 10 | Up to now, our instant, typo-friendly search was only available locally on 11 | your device. You could only index data stored directly in your app. While that 12 | was great for offline apps, it was not so fantastic for rapidly changing data 13 | server-side. All that has just changed! You can now use our search engine 14 | online, enabling you to change your data at any frequency and return 15 | consistantly up-to-date search results in your apps. Interested? Request your 16 | invitation to the Beta from the [features 17 | page][1]. 18 | 19 | And don't forget you can combine it with our offline SDK, for great search 20 | performance whatever the connectivity! 21 | 22 | 23 | [1]: http://www.algolia.com/features/ 24 | -------------------------------------------------------------------------------- /_posts/2013-03-26-instant-search-on-crunchbase.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Instant Search on CrunchBase 4 | author: Nicolas 5 | --- 6 | 7 | After launching the Beta Cloud version of Algolia, we wanted to demonstrate 8 | what it can do. We built a search engine using CrunchBase data, so 9 | entrepreneurs can easily search for their company or themselves. [Check it 10 | out!][1] 11 | 12 | You can search for companies, people and financial organizations, using 13 | multiple attributes. Results are updated after each keystroke and matching 14 | characters are highlighted. And of course it tolerates typos. In this post 15 | we'll explain in more detail how it works. 16 | 17 | ## Indexation 18 | 19 | The CrunchBase API is unfortunately rather poor. There is no way to know the 20 | latest update. So we dump it regularly and push it to our servers in JSON 21 | format after pruning unnecessary attributes and adding images encoded in 22 | base64. 23 | 24 | We actually create 3 indexes for companies (117k+ entries), persons (152k+ 25 | entries) and financial organizations (9k+ entries). The JSON files, including 26 | images, are respectively 150MB, 70MB & 7MB.  The full indexation takes about 5 27 | seconds (excluding upload time). Resulting index sizes are respectfully 124MB, 28 | 85MB and 7,5MB. 29 | 30 | Indexation is done simultaneously in 3 datacenters: US-West, US-East & Europe. 31 | Additional datacenters are on the roadmap. 32 | 33 | ## Instant Search 34 | 35 | We trigger a query directly after page load and again after each keystroke. To 36 | simplify communication with the server, we created a javascript client 37 | (contact us if you want to use it before its release). We then simply call the 38 | search function indicating the callback that will handle resulting hits 39 | asynchronously. More details to follow once we've written the doc! 40 | 41 | We automatically choose the server closest to your location by using [Amazon 42 | Route 53][2]. Once the DNS lookup is resolved, it 43 | lets us get low enough latencies that the response feels nearly instantaneous 44 | (if you test it from North America or Europe). From DSL connections, we obtain 45 | search latencies of about 90ms in San Francisco, 75ms in New York and 65ms in 46 | London. About 20ms are used for querying the index, 5ms for compressing the 47 | data and 5ms for uncompressing. The remaining time is the actual transfer of 48 | the data and depends of your location and the quality of your connection. 49 | 50 | If you're a hacker, you may also remark the presence of an API key in the 51 | javascript. It cannot be hidden as we directly query our servers from the 52 | browser. The operations it enables are however restricted to search only, you 53 | would need to use a different key to update entries for example. You can 54 | create and revoke as many API keys you need directly from the API. 55 | 56 | ## Hits Display 57 | 58 | No designer worked on the demo, but we hope it doesn't show! We execute the 3 59 | queries simultaneously and display the results by blocks of 20 hits. 60 | Additional queries are automatically triggered when scrolling to the bottom of 61 | the page. 62 | 63 | We display approximate results with a transparent background to clearly 64 | differentiate them. 65 | 66 | You can use the arrow keys to navigate inside the results. 67 | 68 | ## Ranking 69 | 70 | We use the standard ranking order. By descending priority: 71 | 72 | * Exact matches before approximate matches; 73 | * User-defined order of attributes; 74 | * Distance between the matching term and the beginning of the attribute; 75 | * Proximity between terms in multi-word queries; 76 | * User defined score. 77 | 78 | For the order of attributes, we use {name, twitter, organization or people, 79 | description}. This translates into very simple settings. Here are the settings 80 | of the persons index, for example: 81 | 82 | 83 | { 84 | "attributesToIndex": ["name", "twitter", "unordered(companies)", "description"], 85 | "attributesToHighlight": ["name", "twitter", "companies", "description"], 86 | "customRanking": ["desc(size)", "asc(name)"] 87 | } 88 | 89 | By default, all attributes are indexed and highlighted: "attributesToIndex" & 90 | "attributesToHighlight" enable us to precisely define what to index (and in 91 | what order) and what to highlight. The "unordered" modifier disable ranking 92 | between values of a multi-valued attributes. 93 | 94 | For the user defined score ("customRanking" in settings) , we sort by 95 | decreasing order of CrunchBase entry size and then by alphabetical order. 96 | 97 | ## Help us 98 | 99 | This is just a demo but we'd like to continue improving it! Please tell us 100 | what you think and send your suggestions: contact at algolia dot com 101 | 102 | 103 | [1]: http://www.algolia.com/demo/crunchbase/ 104 | [2]: http://aws.amazon.com/route53/ 105 | -------------------------------------------------------------------------------- /_posts/2013-04-11-we-are-finalists-at-next-berlin.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: We are NEXT Berlin Finalists! 4 | author: Nicolas 5 | --- 6 | 7 | [![NEXT Berlin Finalists][1]](http://nextberlin.eu/2013/04/next13-start-up-pitch-these-are- 8 | the-12-finalists/)The [NEXT Berlin Conference][2] will 9 | take place on April 23rd & 24th in one of the most active entrepreneurial 10 | ecosystems in Europe!  More than 100 experts will share their knowledge with 11 | an expected audience of 2000 attendees. 12 | 13 | If you follow our newsletter or social presence, chances are you saw our call 14 | for help to participate in the NEXT Berlin startup competition. We sincerely 15 | thank you for your votes! They placed us in the 30 top startups to be 16 | considered for the final. The judges then selected us as one of the [12 17 | finalists][3] to pitch during the conference. We are thrilled to be able 18 | to present Algolia to Berlin! 19 | 20 | If you happen to be attending NEXT Berlin, ping me if you'd like to meet! 21 | (@dessaigne on twitter, or nicolas at algolia dot com). 22 | 23 | 24 | [1]: ./assets/NextBerlin-300x155.png 25 | [2]: http://nextberlin.eu/ 26 | [3]: http://nextberlin.eu/2013/04/next13-start-up-pitch-these-are-the-12-finalists/ 27 | -------------------------------------------------------------------------------- /_posts/2013-04-16-algolia-search-is-now-available-for-rubymotion.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Introducing a RubyMotion search gem by Algolia! 4 | author: Nicolas 5 | --- 6 | 7 | [![Rubymotion search gem by Algolia is now 8 | live!][1]](https://blog.algolia.com/wp- 9 | content/uploads/2013/04/rubymotion1.png)If you are a Ruby developer and have 10 | an iPhone, chances are you already now about the cool project that is 11 | [RubyMotion][2]! I quote: 12 | 13 | > "It lets you quickly develop and test native iOS applications for iPhone or 14 | iPad, all using the awesome Ruby language you know and love." 15 | 16 | And it rocks! It's actually used by the Ruby on Rails sponsor 37signals. 17 | 18 | What if you could use your favorite search engine along with your favorite 19 | language to create iOS apps? That's exactly what we propose with Algolia's 20 | RubyMotion search gem that seamlessly integrates in your Ruby project. You 21 | know the trick: 22 | 23 | 24 |   25 | gem 'motion-algolia-search' 26 | 27 | 28 | The gem code is open source. You can fork it from 29 | [github][3]. 30 | 31 | Special thanks to the RubyMotion team and especially to 32 | [Joffrey][4] for this integration! 33 | 34 | 35 | [1]: ./assets/rubymotion1-270x300.png 36 | [2]: http://www.rubymotion.com/ 37 | [3]: https://github.com/algolia/motion-algolia-search 38 | [4]: https://twitter.com/joffreyjaffeux 39 | -------------------------------------------------------------------------------- /_posts/2013-04-16-v2-our-new-offline-search-sdk-with-geo-search-and-other-features.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'V2: Search by Geolocation in our Offline Search SDK' 4 | author: Nicolas 5 | --- 6 | 7 | While our latest news focused on the Algolia Search cloud offer (you can still 8 | join the [beta][1], we're 9 | pleased to introduce a major new version of Algolia Search offline: V2! It is 10 | available today for iOS, Android and OS X. Windows Phone and Windows versions 11 | will be released as soon as they are ready. A few months in the making, these 12 | new features were built on early customer feedback and will simplify 13 | integration. 14 | 15 | ## Algolia becomes the easiest way to search by geolocation! 16 | 17 | The ease of integration is a constant concern for us and that's why we 18 | carefully consider every new feature. Two important features made it in this 19 | version: 20 | 21 | * Geo-search means the ability to search around a location or inside a bounding box. Results can be sorted by distance and of course geo-queries can be combined with textual ones. We added a dedicated tutorial in the doc to get up to speed with this new feature in no time (for [iOS][2] and [Android][3]. 22 | * Tag filters enable restriction of results to specific tags. We received this demand a number of times in order to avoid the creation of too many specialized indexes. 23 | 24 | These new features are also available in the beta of our cloud version! 25 | 26 | ## Improved performance and ranking 27 | 28 | With some hard work... and a lot of profiling, we have been able to get a 10% 29 | gain in performance on every query. 30 | 31 | In V1, name matches were always considered more important than other 32 | attributes, but we didn't consider differences between other attributes. This 33 | changed in V2: ranking priority now respects the order in which you indicate 34 | attributes in the textToIndex method. It's more powerful while actually being 35 | more consistent with no specific processing of the name field. 36 | 37 | But this improvement comes at the cost of a slightly bigger index and longer 38 | computation. If index size is important or if you need to earn a few 39 | nanoseconds more, you can optimize it away with the increaseCompression 40 | method. You'll get a 10 to 30% reduction in index size and an additional 20% 41 | boost in performance (that's 30% total compared to V1!). 42 | 43 | ## Easy just got easier 44 | 45 | Integrating search in an app has never been so easy. For V2 we took into 46 | account all the excellent feedback we received, and wherever it was possible 47 | we simplified the API: 48 | 49 | * No distinction between suggest and search methods. We wanted to match the expected use-cases of the SDK but it was causing more confusion than anything else. So there is now only one way to send queries to an index: the search method. 50 | * With the addition of geo-search, the index class was becoming crowded. We simplified this by decoupling the search approach and query definition. A small set of search methods enable the developer to choose if the search will be synchronous, use a callback, or batch several queries. And a simple SearchQuery class defines the nature of the queries themselves: geolocation, use of prefixes, tag filters, etc. 51 | * Out of simple strings for which we provide a helper, every indexable object now has a UID. Our use of a "name" for this role led to a few difficulties when collisions were possible (persons for example). There are no longer any privileged attributes. 52 | * License key initialization is now done using a static method. It is a best practice that was actually necessary to build a [RubyMotion gem][4]. 53 | 54 | Specific to Android, we also added an AbstractIndexable abstract class. 55 | Instead of implementing the Indexable interface, you now have the option of 56 | directly extending AbstractIndexable that takes care of optional methods for 57 | you. 58 | 59 | Specific to iOS, you can now directly index core data entities with the 60 | setCoreDataEntityDescription selector. No need to create a wrapper. 61 | 62 | ## Still able to read V1 indexes 63 | 64 | If for any reason you cannot replace or reindex your data, V2 is still able to 65 | search in a V1 index. However, as the name attribute was removed you do need 66 | to implement the IndexableLegacy interface. If you then publish changes, the 67 | new index will be in the V2 format. 68 | 69 | We're really sorry to make our Windows Phone and Windows customers wait. Feel 70 | free to torment us with your needs, it's great motivation to finish more 71 | quickly ;) 72 | 73 | If you're still reading, I guess it's time for you to test this new version of 74 | the Algolia Search Offline SDK. [Get started][5]! 75 | 76 | 77 | [1]: http://blog.algolia.com/our-saas-version-is-in-beta/) 78 | [2]: http://www.algolia.com/doc/ios/#iOS_Geoloc 79 | [3]: http://www.algolia.com/doc/android/#android_Geoloc) 80 | [4]: http://blog.algolia.com/algolia-search-is-now-available-for-rubymotion/ 81 | [5]: http://www.algolia.com/get-started/ 82 | -------------------------------------------------------------------------------- /_posts/2013-04-25-algolia-search-offline-sdk-now-supports-cocoapods.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search Offline SDK now supports Cocoapods 4 | author: Julien 5 | --- 6 | 7 | We have great news for our iOS and OS X users: our Offline SDK is now 8 | available as a _[CocoaPods][1] _dependency_._ 9 | 10 | Cocoapods is a popular dependency management tool that lets you specify the 11 | libraries (dependencies) you want to use for your project in an easy-to-edit 12 | text file (Podfile). It then fetches all the required libraries and sets up 13 | your Xcode workspace. 14 | 15 | You can now set up Algolia Search Offline in your iOS project with this line 16 | in your Podfile: 17 | 18 | `pod 'AlgoliaSearchOffline-iOS-SDK'` 19 | 20 | You can also set up Algolia Search Offline in your OS X project with this 21 | line: 22 | 23 | `pod 'AlgoliaSearchOffline-OSX-SDK'` 24 | 25 | Once you're done, simply use the "pod install" command to set up Algolia 26 | Search Offline in your project. Now it's easy to manage library dependencies 27 | for iOS and OS X projects! 28 | 29 | 30 | [1]: http://www.cocoapods.org/ 31 | -------------------------------------------------------------------------------- /_posts/2013-05-21-instant-search-on-ios-app-store.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Instant Search through the iOS App Store 4 | author: Julien 5 | --- 6 | 7 | [![App Store][1]](http://www.algolia.com/demo/appstore/)If 8 | you have an iOS device you probably search the App Store regularly for apps 9 | you have heard about. Following the recent AppGratis ousting from the 10 | AppStore, there were claims that the App Store search function is broken. That 11 | was our trigger to try something ourselves that could serve both as a good 12 | demo and help us to explore new use-cases! [Check it 13 | out!][2] 14 | 15 | ## Obtaining the data 16 | 17 | So first, we needed to obtain the data. Apple provides an API to accredited 18 | developers, but given that this can be fairly difficult to attain, we 19 | considered other solutions. Crawling was our second option, but that approach 20 | has its own caveats: you need to play nice with their servers or you get 21 | banned (very) quickly. We didn't want to spend days implementing our own 22 | distributed crawler and definitely didn't have the time to do a sequential and 23 | polite crawling. It is in these moments that you are glad to have an external 24 | team to do the job for you. 25 | 26 | We chose to perform the crawling with [grepsr][3], a 27 | service we found via a simple Google search. After a few exchanges we were 28 | confident that they were up to the job, and they ended up exceeding our 29 | expectations. Not only did they crawl the pages, but they also scraped the 30 | apps' attributes to provide us with a clean dataset. After a few days we had 31 | our full dataset ready for indexing. 32 | 33 | ## Indexing 34 | 35 | Indexing was actually the easiest part. We uploaded the data in JSON format to 36 | our backend and used these simple settings: 37 | 38 | 39 | { 40 | "attributesToIndex": ["name", "author", "category"], 41 | "attributesToHighlight": ["name", "author","category", "description"], 42 | "customRanking": ["desc(score)", "asc(name)"] 43 | } 44 | 45 | Our dataset included the 630k applications currently published in the US app 46 | store. For each of them we index the name, author and category, but also 47 | include their icon, score, and description for display and sorting. 48 | 49 | The score is a simple computation between the number of comments and the 50 | average ranking: `rating * log2(nbComments) * 10000`. 51 | 52 | ## Searching 53 | 54 | Similar to our [CrunchBase demo][4], we trigger a query directly after page load and again after each 55 | keystroke. Additional queries are automatically triggered when scrolling to 56 | the bottom of the page. 57 | 58 | [Guillaume Esquevin][5] did the front-end for us 59 | and a first version of the demo was up and ready in no time. Take a look at 60 | how simple and fast it is to search for an app! 61 | 62 | In the end we did receive access to the Apple API, which we may use later on 63 | to keep the data in sync. 64 | 65 | 66 | [1]: ./assets/appstore.jpg 67 | [2]: http://www.algolia.com/demo/appstore/ 68 | [3]: http://www.grepsr.com 69 | [4]: http://blog.algolia.com/instant-search-on-crunchbase/ 70 | [5]: http://platypus-creation.com 71 | -------------------------------------------------------------------------------- /_posts/2013-05-24-algolia-search-offline-2-1-is-out.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Search Offline 2.1 is out! 4 | author: Julien 5 | --- 6 | 7 | We are pleased to introduce a new version of Algolia Search Offline for iOS, 8 | Android and OS X (Windows versions will come soon). 9 | 10 | Version 2.1 significantly improves the out-of-the box relevance of Algolia 11 | Search. We are now confident we have the best relevance on the market. We will 12 | discuss our ranking approach compared to traditional methods in another post. 13 | For now, the two main improvements offered in this version are: 14 | 15 | * When the query string has one word that is the entire content of a field, we will display it first. You can try it with the "arm" query on our Crunchbase demonstration to get the idea: [http://bit.ly/searchcrunchbase](http://bit.ly/searchcrunchbase) (it uses the same relevance approach). 16 | * More importance is given to proximity than to the order of attributes. For example, the query "managing p" will now match first "Managing Partner" in the "Title" attribute instead of "P" in the "Name" attribute followed by "Managing" in the "Title". This is the case even if the order of the attributes is ["Name", "Title", ...]. 17 | 18 | While you can control ranking with the setRankingOrder method, you will 19 | benefit from these improvements by default. 20 | 21 | This new release also introduces some new features: 22 | 23 | * A way to efficiently serialize latitude/longitude and float values in your custom objects (reduce the size of serialized objects by up to 80%). 24 | * A method to compile an index in an old version format. This is useful when indexes are created server side and then pushed to applications that support old versions of Algolia. 25 | * All characters in tag filters are now supported. 26 | * It is now possible to do a logic OR between tags in filters. For example, you can search all contacts that match the query "paul" and have the tag "friend" OR the tag "classmate". 27 | 28 | We hope you'll like these new features, and as ever, we welcome your feedback! 29 | 30 | 31 | -------------------------------------------------------------------------------- /_posts/2013-05-28-discover-our-6-new-search-as-a-service-api-clients.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Discover our 6 new Search-as-a-Service API Clients! 4 | author: Julien 5 | --- 6 | 7 | We [launched the private beta][1] of our Search-as-a-Service offer two months ago. In that time we 8 | received very positive feedback from our beta testers and we couldn't thank 9 | them enough for the help they provided. To date, they have sent over 1M 10 | indexation jobs and over 5M queries, and the trend is increasing. 11 | 12 | Today we are happy to continue simplifying the experience with the release of 13 | six API Clients under the MIT license: 14 | 15 | * [Command line client for linux/mac][2] 16 | * [Ruby client][3] 17 | * [Python client][4] 18 | * [PHP client][5] 19 | * [Javascript client][6] 20 | * [Node.js client][7] 21 | 22 | Ease of integration just improved again! Your feedback (and pull requests) is 23 | most welcome. 24 | 25 | 26 | [1]: http://blog.algolia.com/our-saas-version-is-in-beta/ 27 | [2]: https://github.com/algolia/algoliasearch-client-cmd 28 | [3]: https://github.com/algolia/algoliasearch-client-ruby 29 | [4]: https://github.com/algolia/algoliasearch-client-python 30 | [5]: https://github.com/algolia/algoliasearch-client-php 31 | [6]: https://github.com/algolia/algoliasearch-client-js 32 | [7]: https://github.com/algolia/algoliasearch-client-node 33 | -------------------------------------------------------------------------------- /_posts/2013-06-17-discover-our-new-java-android-search-as-a-service-api-clients-at-droidcon-paris.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: New Java & Android Search-as-a-Service API Clients at DroidCon Paris! 4 | author: Julien 5 | --- 6 | 7 | Our Search-as-a-Service offer is progressing toward its official release. We 8 | launched our [Java][1] and 9 | [Android ][2]search API 10 | Clients at [DroidCon Paris][3] today! Come to see 11 | us if you're attending! 12 | 13 | And don't forget we also provide developers with an [offline 14 | SDK][4] they can use to search directly on 15 | Android devices with no connection to the network. Developers now have the 16 | perfect tools to build a great search experience both online and offline. 17 | 18 | The Android API Client is based on the Java client and adds support of 19 | asynchronous API calls. You can thus easily trigger a search query from the UI 20 | thread and get the result in a listener without any additional line of code. 21 | You have just to implement the IndexListener interface. 22 | 23 | With these two new clients, we now have eight API Clients released under the 24 | MIT license to simplify integration of Algolia Search as a Service: 25 | 26 | * [Java Client][5] 27 | * [Android Client][6] 28 | * [Ruby client][7] 29 | * [Python client][8] 30 | * [PHP client][9] 31 | * [Javascript client][10] 32 | * [Node.js client][11] 33 | * [Command line client for linux/mac][12] 34 | 35 | Ease of integration just improved again! Your feedback (and pull requests) is 36 | most welcome. 37 | 38 | 39 | [1]: https://github.com/algolia/algoliasearch-client-java 40 | [2]: https://github.com/algolia/algoliasearch-client-android 41 | [3]: http://fr.droidcon.com/2013/ 42 | [4]: http://www.algolia.com/doc/android/ 43 | [5]: https://github.com/algolia/algoliasearch-client-java 44 | [6]: https://github.com/algolia/algoliasearch-client-android 45 | [7]: https://github.com/algolia/algoliasearch-client-ruby 46 | [8]: https://github.com/algolia/algoliasearch-client-python 47 | [9]: https://github.com/algolia/algoliasearch-client-php 48 | [10]: https://github.com/algolia/algoliasearch-client-js 49 | [11]: https://github.com/algolia/algoliasearch-client-node 50 | [12]: https://github.com/algolia/algoliasearch-client-cmd 51 | -------------------------------------------------------------------------------- /_posts/2013-06-24-check-out-the-new-iosos-x-clients-for-our-search-as-a-service-offer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: New iOS and OS X API clients for our Search-as-a-Service offer 4 | author: Julien 5 | --- 6 | 7 | [![Build new things with our iOS and OS X API 8 | client.][1]](https://blog.algolia.com/wp- 9 | content/uploads/2013/06/objC.png)One week after releasing our [Java & Android 10 | clients][2], we are happy to release our [iOS and 11 | OS X API][3] clients for 12 | our search-as-a-service offer. 13 | 14 | In order to ease the setup, we support Cocoapods. Installation of the client 15 | just requires one line in your Podfile: 16 | 17 | `pod 'AlgoliaSearch-Client', '~> 1.0` 18 | 19 | And don't forget we also provide developers with an [offline 20 | SDK][4] that they can use to search directly on 21 | iOS devices with no connection to the network. Developers now  have the 22 | perfect tools to build a great search experience both online and offline. 23 | 24 | With this new client, we now have API Clients for the most popular languages 25 | and platforms. They are all released under the MIT license and available on 26 | our Github account: 27 | 28 | * [iOS and OS X client][5] 29 | * [Java client][6] 30 | * [Android client][7] 31 | * [Ruby client][8] 32 | * [Python client][9] 33 | * [PHP client][10] 34 | * [Javascript client][11] 35 | * [Node.js client][12] 36 | * [Command line client for linux/mac][13] 37 | 38 | Ease of integration just improved again! Your feedback (and pull requests) is 39 | most welcome. 40 | 41 | 42 | [1]: ./assets/objC.png 43 | [2]: http://blog.algolia.com/discover-our-new-java-android-search-as-a-service-api-clients-at-droidcon-paris/ 44 | [3]: https://github.com/algolia/algoliasearch-client-objc 45 | [4]: http://www.algolia.com/doc/ios/ 46 | [5]: https://github.com/algolia/algoliasearch-client-objc 47 | [6]: https://github.com/algolia/algoliasearch-client-java 48 | [7]: https://github.com/algolia/algoliasearch-client-android 49 | [8]: https://github.com/algolia/algoliasearch-client-ruby 50 | [9]: https://github.com/algolia/algoliasearch-client-python 51 | [10]: https://github.com/algolia/algoliasearch-client-php 52 | [11]: https://github.com/algolia/algoliasearch-client-js 53 | [12]: https://github.com/algolia/algoliasearch-client-node 54 | [13]: https://github.com/algolia/algoliasearch-client-cmd 55 | -------------------------------------------------------------------------------- /_posts/2013-07-08-excellent-asian-languages-support-in-our-offline-search-sdk-2-2.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Asian Language support in our Offline Search SDK 2.2 4 | author: Julien 5 | --- 6 | 7 | Like most search engines, version 2.1 did not include any specific processing 8 | for Asian Languages. Version 2.2 significantly improves Asian language support 9 | (Chinese, Japanese, Korean) by including specific processing like the 10 | automatic conversion between Simplified Chinese and Traditional Chinese using 11 | the [Unicode UniHan Database](http://www.unicode.org/charts/unihan.html). This 12 | advanced processing was only possible because we built our own [Unicode 13 | library](http://blog.algolia.com/why-develop-our-own-unicode-library/). Many 14 | thanks to [Stephen](https://twitter.com/stephencremin) for his help! 15 | 16 | This release also contains other improvements we released first for our SaaS 17 | version: 18 | 19 | * The out-of-the-box ranking was greatly improved when queries contained more than two words, 20 | * Indexing speed was greatly improved on mobile (2 times more efficient), 21 | * Search speed was improved by about 20%. 22 | 23 | We hope you’ll like these new features, and as ever, we welcome your feedback! 24 | 25 | -------------------------------------------------------------------------------- /_posts/2013-07-18-our-search-as-a-service-offer-has-now-10-api-clients.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Our Search-as-a-Service offer has now 10 API Clients! 4 | author: Julien 5 | --- 6 | 7 | We recently reached a new milestone towards the release of our Search as a 8 | Service offer. We're now proud to offer 10 API clients, covering all major 9 | languages. 10 | 11 | Ease of use was a major focus during development. We began by offering a 12 | complete and easy-to-integrate [REST API][1]. 13 | Providing API clients was a logical way to improve ease of use. You can now 14 | quick start and test the engine with your data in a couple of minutes, with no 15 | prior configuration whatsoever. Each API Client is released under the MIT 16 | License and comes with a quick start and complete documentation: 17 | 18 | * [Javascript client][2] 19 | * [Ruby client][3] 20 | * [Python client][4] 21 | * [PHP client][5] 22 | * [iOS and OS X client][6] 23 | * [Android client][7] 24 | * [Java client][8] 25 | * [C# client for Windows, Windows Phone and Silverlight][9] 26 | * [Node.js client][10] 27 | * [Command line client for linux/mac][11] 28 | 29 | This variety of languages and platforms reveals the diversity of our beta 30 | testers: 31 | 32 | * Customer size: from a small startup developing their MVP, to a big social network searching in their 130M+ users. 33 | * Volume: from a few queries to tens of millions per day.  34 | * Technical environments: mobile, desktop, and web apps. 35 | 36 | Interested in trying it out yourself? Ask for an 37 | [invite][12]! 38 | 39 | 40 | [1]: http://docs.algoliav1.apiary.io/ 41 | [2]: https://github.com/algolia/algoliasearch-client-js 42 | [3]: https://github.com/algolia/algoliasearch-client-ruby 43 | [4]: https://github.com/algolia/algoliasearch-client-python 44 | [5]: https://github.com/algolia/algoliasearch-client-php 45 | [6]: https://github.com/algolia/algoliasearch-client-objc 46 | [7]: https://github.com/algolia/algoliasearch-client-android 47 | [8]: https://github.com/algolia/algoliasearch-client-java 48 | [9]: https://github.com/algolia/algoliasearch-client-csharp 49 | [10]: https://github.com/algolia/algoliasearch-client-node 50 | [11]: https://github.com/algolia/algoliasearch-client-cmd 51 | [12]: http://www.algolia.com/pricing/ 52 | -------------------------------------------------------------------------------- /_posts/2014-01-18-search-grader-engine-performing.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Search Grader by Algolia: How does your search engine perform?' 4 | author: Maxime 5 | --- 6 | 7 | [![algolia-search-grader][1]](http://grader.algolia.com) 8 | 9 | ## Search is important 10 | 11 | An effective search engine should be a seamless and natural extension of the 12 | user experience. With improved relevance, your users should be able to find 13 | what they are looking for in no time. 14 | 15 | Unfortunately, developers often consider search as a second-tier priority. 16 | This is a mistake. Every day, consumers use Google, Amazon, and Youtube to 17 | find what they want on the web quickly and easily. Users of web applications 18 | and eCommerce websites will feel the gap in search experience. As their 19 | expectations are not met, your conversion rate will plummet, your bounce rate 20 | will skyrocket, and the damage to your brand may be irredeemable. 21 | 22 | ## Search is tricky 23 | 24 | The reason why many web applications and e-commerce websites suffer from bad 25 | search is because finding a good solution is not easy. Few current search 26 | technologies combine relevancy and business metrics in a way that sorts search 27 | results optimally. 28 | 29 | In most cases, they fail on the following items: 30 | 31 | * long response times, 32 | * no handling of mistakes, 33 | * no search field auto-completion, 34 | * unexplainable or even nonexistent results. 35 | 36 | To improve your search experience, you first need to understand which areas 37 | are problematic. That's exactly why we built Search Grader by Algolia. 38 | 39 | ## Introducing Search Grader by Algolia 40 | 41 | [Search Grader][2] by Algolia is a tool to help you 42 | quickly find out what your search engine may be missing. We divided the search 43 | user experience in 3 categories in order to get a maximum score of 100: 44 | 45 | * User Experience: 30 points 46 | * Speed: 20 points 47 | * Relevance: 50 points 48 | 49 | **User Experience: 30/100** 50 | 51 | User experience is not just design, it's the key of a good user satisfaction. 52 | If your users cannot find what they're searching for, they will just leave. 53 | 54 | * **Searchbox visibility (3 pts)**: It is easier for your users to find something if your search bar is clearly visible! 55 | * **Descriptive placeholder (2 pts) **: A hint in your search bar is a good way to let your users know what kind of data they can dig into. 56 | * **Searchbox auto-completion (6 pts)**: Auto-completion guides your users more efficiently towards what they are looking for. 57 | * **Suggestions after the first keystroke (5 pts)**: Delight your users by providing relevant suggestions immediately after the first keystroke. 58 | * **Faceting (4 pts)**: Faceting enables users to browse results by filtering them on specific categories (e.g., author, tags, price). 59 | * **Highlight (6 pts)**: You need to explain why the displayed results are chosen, especially when you tolerate typos or misspelled queries. 60 | * **Pagination (2 pts)**: Providing relevant results on the first page is great. But to keep your users engaged, you need to give them an easy way to access other results. 61 | * **Picture (2 pts):** Sometime images are the fastest way to display information. Users will go through results and find the right hits much faster if you show them images. 62 | 63 | **Speed: 20/100** 64 | 65 | If results show up in more than 200ms, you will lose part of your users. Time 66 | is money, real-time is gold. Because your location is important to the speed 67 | of the search we graded speed 3 times based on the location of the user: 68 | 69 | * Response time from US East coast 70 | * Response time from US West coast 71 | * Response time from Europe 72 | 73 | **Relevance: 50/100** 74 | 75 | Relevance is when you give your users what they want in the top results. 76 | Although it's not very fancy, it's probably the more critical aspect of a good 77 | search engine. 78 | 79 | * **Typo-tolerance (10 pts)**: People make a lot of typos, especially on mobile devices. Tolerating misspelled queries provides a great value to both your users and the products you promote. 80 | * **Auto-completion shows results, not queries (10 pts)**: Suggesting queries is good. Suggesting results directly is a lot better as you spare your users one click and a lot of time. 81 | * **Ranking uses business metrics (10 pts)**: Considering customized criteria such as sales numbers or the popularities in the way you rank results makes a key difference. It is THE way to give relevant results with one single keystroke. 82 | * **Overall ranking (20 pts)**: Search must always return relevant results. We perform multiple queries to detect if your search is performing well. 83 | 84 | ## Get Google, Amazon-like search for your website 85 | 86 | These criteria were defined by our team of experts with over 30+ years of 87 | experience in search. 88 | 89 | We tested out some of the biggest names in tech: 90 | 91 | **[![Algolia search grader][3]](http://grader.algolia.com)** 92 | 93 | As you could expect, Amazon and LinkedIn received an excellent score of 94 | 90/100. That's the kind of quality Algolia can help you achieve in your 95 | application or e-commerce website, for as low as 96 | [$19/month][4]. 97 | 98 | Now, how about your search? How is it performing? To find out, use [Search 99 | Grader][5] by Algolia. 100 | 101 | If you want to share your ideas with us, please leave your comments! 102 | 103 | 104 | [1]: ./assets/Capture-decran-2014-01-24-01.26.08-600x150.png 105 | [2]: http://grader.algolia.com/ 106 | [3]: ./assets/Capture-decran-2014-01-17-18.22.23.png 107 | [4]: http://www.algolia.com/pricing/ 108 | [5]: http://grader.algolia.com/ 109 | -------------------------------------------------------------------------------- /_posts/2014-01-29-postmortem-todays-8min-indexing-downtime.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Postmortem of today's 8min indexing downtime 4 | author: Julien 5 | --- 6 | 7 | Today (Jan 29) at 9:30pm UTC, our service experienced an 8 minute partial 8 | outage during which we have rejected many write operations sent to the 9 | indexing API (exactly 2841 calls). We call it "partial" as all search queries 10 | have been honored without any problem. For end-users, there was no visible 11 | problem. 12 | 13 | Transparency is in our DNA: this outage is visible on our status page 14 | ([status.algolia.com][1]) but we also wanted to share 15 | with you all the details of the outage and more importantly the details of our 16 | response. 17 | 18 | ## The alert 19 | 20 | This morning I fixed a rare bug in indexing complex hierarchical objects. This 21 | fix successfully passed all the tests after development. We have 6000+ unit 22 | tests and asserts, and 200+ non regression tests. So I felt confident when I 23 | entered the deploy password in our automatic deployment script. 24 | 25 | A few seconds after, I started to receive a lot of text messages on my 26 | cellphone. 27 | 28 | We developed several embedded probes to detect all kinds of problems and alert 29 | us using Twilio and Hipchat APIs. They detect for example: 30 | 31 | * a process that restart 32 | * an unusually long query 33 | * a write failure 34 | * a low memory warning 35 | * a low disk-free warning 36 | * etc. 37 | 38 | In case embedded probes can't run, other external probes run once a minute 39 | from an independent datacenter (Google App Engine). These also automatically 40 | update our status page when a problem impacts the quality of service. 41 | 42 | Our indexing processes were crash looping. I immediately decided to rollback 43 | to the previous version. 44 | 45 | ## The rollback 46 | 47 | Until today, our standard rollback process was to revert the commit, launch 48 | the recompile and finally deploy. This is long, very long when your know that 49 | you have an outage in production. The rollback took about 5 minutes in total 50 | out of the 8 minutes. 51 | 52 | ## How we will avoid this situation in the future 53 | 54 | Even if the outage was on a relatively small period of time, we still believe 55 | it was too long. To make sure this will not happen again: 56 | 57 | * We have added a very fast rollback process in the way of a simple press button like the one we use to deploy. An automatic deploy is nice, but an automatic rollback is actually more critical when needed! 58 | * Starting now, we will deploy new versions of the service on clusters hosting community projects such as Hacker News Search or Twitter handle search, before pushing the update on clusters hosting paying customers. Having real traffic is key to detect some types of errors. Unit-tests & non-regression tests cannot catch everything. 59 | * And of course we added non-regression tests for this specific error. 60 | 61 | ## Conclusion 62 | 63 | Having all these probes in our infrastructure was key to detect today's 64 | problem and react quickly. In real conditions, it proved not to be enough. In 65 | a few hours we have implemented a much better way to handle this kind of 66 | situation. The quality of our service is our top priority. Thank you for your 67 | support! 68 | 69 | 70 | [1]: http://status.algolia.com 71 | -------------------------------------------------------------------------------- /_posts/2014-03-14-added-asian-datacenter-offer.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Now Provides Realtime Search in Asia! 4 | author: Julien 5 | --- 6 | 7 | [![New datacenter allows realtime search in Asia][1]](http://blog.algolia.com/added-asian- 8 | datacenter-offer/screen-shot-2014-03-13-at-17-51-50/) 9 | 10 | One of the terrific advantages of building a SaaS company is that your clients 11 | can be anywhere in the world. We now have customers in more than 15 different 12 | countries distributed across South America, Europe, Africa, and, of course, 13 | North America. We feel incredibly lucky to have so many international 14 | customers trusting us with their search. 15 | 16 | Language support is one of the key factors that enabled us to enter these 17 | markets. Since the beginning, we wanted to support every language used on the 18 | Internet. To back our vision with action, we developed a very good support of 19 | Asian languages over time. As an example, we are able to automatically 20 | retrieve results in Traditional Chinese when the query is in Simplified 21 | Chinese (or vice-versa). You simply need to add objects in Chinese, Japanese 22 | or Korean, and we handle the language processing for you. 23 | 24 | Despite the fact that we could process Asian languages well, we didn't plan to 25 | open an Asian datacenter so early, mainly because we thought the API as a 26 | service market was less mature in Asia than in the US or Europe. But we were 27 | surprised when an article on [36kr.com][2] 28 | gave us dozen of signups from China. We got more signups from China in the 29 | past month than from Canada! 30 | 31 | One of our core values is the speed of our search engine. To provide a 32 | realtime search experience, we want the response times to be lower than 100ms, 33 | including the round trip to search servers. In this context a low latency is 34 | essential. Up to now we have been able to cover North America and Europe in 35 | less than 100ms (search computation included) but our latency with Asia was 36 | between 200ms and 300ms. 37 | 38 | The first step of our on-boarding process is to select the datacenter where 39 | your search engine is hosted (we offer multi-datacenter distribution only for 40 | enterprise users). Interestingly, we discovered that we had no drop for 41 | European & US users but it became significant for others. It was a difficult 42 | choice for people outside of these two regions, or even between the two 43 | datacenters. So we also now display the latency from your browser and pre- 44 | select the "closest" datacenter. 45 | 46 | To propose better latency and to reduce friction in the on-boarding process, 47 | it was clear that we had to add a datacenter in Asia. We chose Singapore for 48 | its central location. Unfortunately, the hosting market is very different in 49 | Asia. It's much more expensive to rent servers, so we sadly had to add a 50 | premium on plan prices when choosing this datacenter. 51 | 52 | We are very happy to open this new datacenter in Asia with a latency that 53 | reaches our quality standard. Now that Algolia provides realtime search in 54 | Asia, we are even happier to be able to help multinational websites and apps 55 | provide a great search experience to all their users across Europe, North 56 | America & Asia in less than 100ms with our multi-datacenter support!* 57 | 58 | _Multi-datacenter support is currently only available for Enterprise 59 | accounts._ 60 | 61 | 62 | [1]: ./assets/Screen-Shot-2014-03-13-at-17.51.50-300x199.png 63 | [2]: http://www.36kr.com/p/209747.html 64 | -------------------------------------------------------------------------------- /_posts/2014-03-15-algolia-heroku-add-on-enters-ga.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia Heroku add-on enters general availability 4 | author: Julien 5 | --- 6 | 7 | We launched the first beta of our Heroku add-on in October 2013 and are now 8 | happy to announce its general availability! 9 | 10 | During the beta period we received excellent feedback (and some bug reports!) 11 | that helped us improve our integration. We are now fully ready to serve 12 | production on both Heroku datacenters. If you were part of our beta program, 13 | we will contact you shortly to invite you to migrate to a standard plan. 14 | 15 | You can directly install it from our [Heroku add-on 16 | page][1] and as ever, please [let us 17 | know][2] if you have any feedback! 18 | 19 | 20 | [1]: https://addons.heroku.com/algoliasearch 21 | [2]: mailto:hey@algolia.com 22 | -------------------------------------------------------------------------------- /_posts/2014-03-17-caused-todays-performance-issues-europe-will-happen.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: What Caused Today's Search Performance Issues In Europe and Why It Will Not Happen Again 4 | author: Julien 5 | --- 6 | 7 | During a few hours on March 17th you may have noticed longer response times 8 | for some of the queries sent by your users. 9 | 10 | ![Slower than average search 11 | performance](./assets/slowerthanaverage.png) 12 | 13 | _Average latency for one of our European clusters on March 17th_ 14 | 15 | As you can see above, our slowest average response time (measured from the 16 | user's browser to our servers and back to the user's browser) on one of our 17 | European clusters peaked at 858ms. On a normal day, this peak is usually no 18 | higher than 55ms. 19 | 20 | This was clearly not a normal behavior for our API, so we investigated. 21 | 22 | ## How indexing and search calls share the resource 23 | 24 | Each cluster handles two kinds of calls on our REST API: the ones to build and 25 | modify the indexes (Writes) and the ones to answer users' queries (Search). 26 | The resources of each cluster are shared between these two uses. As Write 27 | operations are far more expensive than Search calls, we designed our API so 28 | that indexing should never use more than 10% of these resources. 29 | 30 | Up until now, we used to set a limitation on the rate of Writes _per HTTP 31 | connection_. There was no such limit for queries (Search); We simply limited 32 | Write calls to keep search quality. To avoid reaching the Write rate limit too 33 | quickly, we recommended users to Write by batching up to 1GB of operations per 34 | call, rather than sending them one by one. (A batch, for example, could be 35 | adding 1M products to an index on a single network call.) A loophole in this 36 | recommendation was the origin of yesterday's issues. 37 | 38 | What happened yesterday is that on one of our European clusters, one customer 39 | pushed so many unbatched indexing calls from different HTTP connections that 40 | they massively outnumbered the search calls of the other users on the cluster. 41 | 42 | This eventually slowed down the average response time for the queries on this 43 | cluster, impacting our usual search performance. 44 | 45 | ## The Solution 46 | 47 | As of today, we now set the rate limit of Writes _per account_ and not per 48 | HTTP connection. It prevents anyone from using multiple connections to bypass 49 | this Write rate limit. This also implies that customers who want to push a lot 50 | of operations in a short time simply need to send their calls in batches. 51 | 52 | How would you batch your calls? The explanation is in our documentation. See 53 | here for an example with our Ruby client: [https://github.com/algolia 54 | /algoliasearch-client-ruby#batch-writes](https://github.com/algolia 55 | /algoliasearch-client-ruby#batch-writes) 56 | 57 | 58 | -------------------------------------------------------------------------------- /_posts/2014-03-18-handle-security-realtime-search.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Realtime Search: Security and our Javascript Client' 4 | author: Julien 5 | --- 6 | 7 | _**Edit: As suggested on [Hacker 8 | News][1], SHA256 is not secure, as 9 | it allows a length extension attack. We have replaced it with HMAC-SHA256.**_ 10 | 11 | Instant is in our DNA, so our first priority was to build a search backend 12 | that would be able to return relevant realtime search results in a few 13 | milliseconds. However, the backend is just one variable in our realtime 14 | equation. The response time perceived by the end user is the total lapse of 15 | time between their first keystroke and the final display of their results. 16 | Thus, with an extremely fast backend, solving this equation comes down to 17 | optimising network latency. This is an issue we solve in two steps: 18 | 19 | * First, we have [datacenters in three different locations][2], allowing us to answer queries in North America, Europe and Asia in less than 100ms (including search computation). 20 | * Second, to keep reducing this perceived latency, queries must be sent directly from the end users' browsers or mobile phones to our servers. To avoid intermediaries like your own servers, we offer a JavaScript client for websites and ObjC/Android/C# clients for mobile apps. 21 | 22 | ## The security challenge of JavaScript 23 | 24 | Using this client means that you need to include an API key in your JavaScript 25 | (or mobile app) code. The first security issue with this approach is that this 26 | key can be easily retrieved by anyone who simply looks at the code of the 27 | page. This gives that person the potential to modify the content behind the 28 | website/mobile application! To fix this problem, we provide search-only API 29 | keys which protect your indexes from unauthorized modifications. 30 | 31 | This was a first step and we've quickly had to solve two other security 32 | issues: 33 | 34 | * **Limiting the ability to crawl your data: **you may not want people to get all your data by continuous querying. The simple solution was to limit the number of API calls a user could perform in a given period of time. We implemented this by setting a rate limit per IP address. However, this approach is not acceptable if a lot of users are behind a global firewall, thus sharing one IP address. This is very likely for our corporate users. 35 | * **Securing access control**:  you may need to restrict the queries of a user to specific content. For example, you may have power users who should get access to more content than "regular" users. The easy way to do it is by using filters. The problem here with simple filters in your JavaScript code is that people can figure out how to modify these filters and get access to content they are not be supposed to see. 36 | 37 | ## How we solve it altogether 38 | 39 | Today, most websites and applications require people to create an account and 40 | log in to access a personalized experience (think of CRM applications, 41 | Facebook or even Netflix). We decided to use these user IDs to solve these two 42 | issues by creating signed API keys. Let's say you have an API key with search 43 | only permission and want to apply a filter on two groups of content (public OR 44 | power_users_only) for a specific user (id=42): 45 | 46 | 47 | api_key=20ffce3fdbf036db955d67645bb2c993 48 | query_filters=(public,power_users_only) 49 | user_token=42 50 | 51 | You can generate a secured API key in your backend that is defined by a hash 52 | (HMAC SHA 256) of three elements: 53 | 54 | 55 | secured_api_key=HMAC_SHA_256(api_key, query_filters + user_token) 56 | secured_api_key=HMAC_SHA_256("20ffce3fdbf036db955d67645bb2c993", "(public,power_users_only)" + "42") 57 | secured_api_key="3abb95c273455ce9b57c61ee5258ba44093f17022dd4bfb39a37e56bee7d24a5" 58 | 59 | For example, if you are using rails, the code in your backend would be: 60 | 61 | 62 | secured_key = Algolia.generate_secured_api_key('20ffce3fdbf036db955d67645bb2c993', '(public,power_users_only)', '42') 63 | 64 | You can then initialize your JavaScript code with the secured API key and 65 | associated information: 66 | 67 | The user identifier (defined by SetUserToken) is used instead of the IP 68 | address for the rate limit and the security filters (defined by 69 | SetSecurityTags) are automatically applied to the query. 70 | 71 | In practice, if a user wants to overstep her rights, she will need to modify 72 | her security tags and figure out the new hash. Our backend checks if a query 73 | is legit by computing all the possible hashes using all your available API 74 | keys for the queried index, as well as the security tags defined in the query 75 | and the user identifier (if set).  If there is no match between the hash of 76 | the query and the ones we computed, we will return a permission denied (403). 77 | Don't worry, reverse-engineering the original API key using brute-force would 78 | require years and [thousands of 79 | core][3]. 80 | 81 | You may want to apply security filters without limiting the rate of queries, 82 | so if you don't need both of these features, you can use only one. 83 | 84 | We launched this new feature a few weeks ago and we have received very good 85 | feedback so far. Our customers don't need to choose anymore between security 86 | and realtime search. If you see any way to improve this approach, we would 87 | love to hear your feedback! 88 | 89 | 90 | [1]: https://news.ycombinator.com/item?id=7419205 91 | [2]: http://blog.algolia.com/added-asian-datacenter-offer/ 92 | [3]: http://en.wikipedia.org/wiki/SHA-2#Comparison_of_SHA_functions 93 | -------------------------------------------------------------------------------- /_posts/2014-03-25-hipchats-blog-algolia-extends-hipchat-customer-support.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'On HipChat''s blog: Algolia extends HipChat to customer support' 4 | author: Sylvain 5 | --- 6 | 7 | As you may probably know, we're using HipChat to build our live-help chat. If 8 | you want to know more, go ahead and read our [guest post on HipChat's 9 | blog][1]. 10 | 11 | [![Hipchat: Live help chat.](./assets/Divided%20screen%20hipchat%20algolia.png)](http://blog.hipchat.com/2014/03/25/algolia-extends-hipchat-to-customer-support/) 12 | 13 | Algolia uses HipChat to 14 | provide live customer service over chat. 15 | 16 | 17 | [1]: http://blog.hipchat.com/2014/03/25/algolia-extends-hipchat-to-customer-support/ 18 | -------------------------------------------------------------------------------- /_posts/2014-03-29-introducing-algolias-search-analytics.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Introducing Search Analytics: Know Your Users Better' 4 | author: Gaetan 5 | --- 6 | 7 | This week we have released a much requested feature by our customers: 8 | analytics. 9 | 10 | ### The importance of analytics to search 11 | 12 | At Algolia, our goal is to revolutionize the way people search and access 13 | content inside the Web and mobile services. Think about Spotify, LinkedIn, 14 | Amazon: Everyone wants to find the right songs, people and products in just a 15 | couple keystrokes. Our challenge is to provide fast and meaningful access to 16 | all of this content via a simple search box. In March, we answered more than 17 | 200 million user queries for our customers on every continent. 18 | 19 | Providing the right content through the right search and browsing experience 20 | is key. For our customers, understanding their users - what they like, what 21 | they want and when they want it -  is just as important, if not more. This is 22 | why we came up with this new analytics section, built on top of our API and 23 | available on our customers' online dashboards when they log in to their 24 | Algolia account. So what exactly do we track for you? 25 | 26 | We describe here some of the top features that are now available to all our 27 | users. 28 | 29 | ### Most popular queries 30 | 31 | In this chart, we show which items were most queried. It would be useful, for 32 | example, to a procurement department for anticipating their  most frequently- 33 | searched products' inventory needs. And if you monetize your service through 34 | advertising, know what people are most interested in is especially valuable. 35 | 36 | A new analytics feature supports the most popular queries. 37 | 38 | ### Queries with no or a few results 39 | 40 | Today, most services are simply clueless when it comes to what is missing in 41 | their content base. How do you know that your catalogue of products fits your 42 | users' expectations? Knowing whether or not you provide what your users need 43 | is critical for your business. 44 | 45 | [![Search Analytics: Track top queries](./assets/Top-search-1024x409.png)](https://blog.algolia.com/wp-content/uploads/2014/03/Top-search.png) Algolia lets you determine which top queries have few or 46 | nonexistent results. 47 | 48 | ### How does a query evolve over time? 49 | 50 | Is Chanel more popular than Louis Vuitton in the morning or at night? Are 51 | bikes more popular in June or in December? With this new feature, you can now 52 | answer such questions for your own content by following the number of times a 53 | specific query is typed on an hourly basis. 54 | 55 | ![Search Analytics: Track 56 | popularity of a search query over 57 | time](./assets/Trend Louboutin.png) Example: Search 58 | analytics lets you track the evolution of the query "louboutin" over 24 59 | hours. 60 | 61 | ### Which categories do people search the most? 62 | 63 | When users type in a query, they often use categories to refine the results. 64 | We let you know which categories were the most frequently used for refinement. 65 | We even provide the most used combinations of categories (such as "dress" + 66 | "blue" + "size M"). It should help you understand how your users browse your 67 | content and has broader implications if the ergonomics of your app is 68 | optimized. 69 | 70 | ![Search Analytics: Top categories used for filtering an 71 | refinement](./assets/Top categories.png) Track which 72 | combinations of categories people search for the most. 73 | 74 | These new analytics features are included in our existing plans at no extra 75 | cost. The number of days when our analytics tools are available vary based on 76 | the plan you choose. We hope you will like it, and we will be more than happy 77 | to read your feedback and feature requests! 78 | 79 | 80 | -------------------------------------------------------------------------------- /_posts/2014-04-09-dealing-openssl-security-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Dealing with OpenSSL Heartbleed Vulnerability 4 | author: Julien 5 | --- 6 | 7 | Yesterday, the OpenSSL project released an update to fix a serious security 8 | issue. This vulnerability was disclosed in [CVE-2014-0160](https://web.nvd.nis 9 | t.gov/view/vuln/detail?vulnId=CVE-2014-0160) and is more widely known as the 10 | [Heartbleed vulnerability](http://heartbleed.com/). It allows an attacker to 11 | grab the content in memory on a server. Given the widespread use of OpenSSL 12 | and the versions affected, this vulnerability affects a large percentage of 13 | services on the internet. 14 | 15 | Once the exploit was revealed, we responded immediately: All Algolia services 16 | were secured the same day, by 3pm PDT on Monday, April 7th. The fix was 17 | applied on all our API servers and our website. We then generated new SSL 18 | certificates with a new private key. 19 | 20 | Our website is also dependent on Amazon Elastic Load Balance, which was 21 | affected by this issue and [updated](http://aws.amazon.com/security/security- 22 | bulletins/aws-services-updated-to-address-openssl-vulnerability/) later on 23 | Tuesday, April 8th. We then changed the website certificate. 24 | 25 | **All Algolia servers are no longer exposed to this vulnerability.** 26 | 27 | ## Your credentials 28 | 29 | We took the time to analyze the past activity on our servers and did not find 30 | any suspicious activity. We are confident that no credentials were leaked. 31 | However, given that this exploit existed in the wild for such a long time, it 32 | is possible that an attacker could have stolen API keys or passwords without 33 | our knowledge. As a result, we recommend that all Algolia users change the 34 | passwords on their accounts. We also recommend that you reset your Algolia 35 | administration API key, which you can do at the bottom of the "Credential" 36 | section in your dashboard. Be careful to update it everywhere you use it in 37 | your code (once you have patched your SSL library if you too are vulnerable). 38 | 39 | ## Security at Algolia 40 | 41 | The safety and security of our customer data are our highest priorities. We 42 | are continuing to monitor the situation and will respond rapidly to any other 43 | potential threats that may be discovered. 44 | 45 | If you have any questions or concerns, please email us directly at 46 | [security@algolia.com](mailto:security@algolia.com) 47 | 48 | -------------------------------------------------------------------------------- /_posts/2014-05-22-synonym-search-engine.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: A New Way to Handle Synonyms in a Search Engine 4 | author: Julien 5 | --- 6 | 7 | We recently added the support for Synonyms in Algolia! It has been the most 8 | requested feature in Algolia since our launch in September. While it may seem 9 | simple, it actually took us some time to implement because we wanted to do it 10 | in a different way than classic search engines. 11 | 12 | ## What's wrong with synonyms 13 | 14 | There are two main problems with how existing search engines handle synonyms. 15 | These issues disturb the user experience and could make them think _"this 16 | search engine is buggy"_. 17 | 18 | ### Typeahead 19 | 20 | In most search engines, synonyms are not compatible with typeahead search. For 21 | example, if you want tablet  to equal  ipad in a query, the prefix search for 22 | t , ta , tab , tabl  & table  will not trigger the expansion on iPad ; Only 23 | the tablet query will. Thus, a single new letter in the search bar could 24 | totally change the result set, catching users off-guard. 25 | 26 | ### Highlighting 27 | 28 | Highlighting matched text is a key element of the user experience, especially 29 | when the search engine tolerates typos. This is the difference between making 30 | users think _"I don't understand this result"_ and _"This engine was able to 31 | understand my errors"_. Synonym expansions are rarely highlighted, which 32 | breaks the trust of the users in the search results and can feel like a bug. 33 | 34 | ## Our implementation 35 | 36 | We have identified two different use cases for synonyms: equalities and 37 | placeholders. The first and most common use case is when you tell the search 38 | engine that several words must be considered equal, for example st and street 39 | in an address. The second use case, which we call a _placeholder_, is when you 40 | indicate that a specific token can be replaced by a set of possible words and 41 | that the token itself is not searchable. For example, the content  42 | street could be matched by the queries 1st street or 2nd street but not the 43 | query number street. 44 | 45 | For the first use case, we have added a support of synonyms that is compatible 46 | with prefix search and have implemented two different ways to do highlighting 47 | (controlled by thereplaceSynonymsInHighlight  query parameter): 48 | 49 | 1. A mode where the original word that matched via a synonym is highlighted. For example if you have a record that contains black ipad 64GB  and a synonym black equals dark, then the following queries will fully highlight the black word : ipad d , ipad da , ipad dar & ipad dark. The typeahead search is working and the synonym expansion is fully highlighted: `**black** **ipad** 64GB` . 50 | 2. A mode where the original word is replaced by the synonym, and the matched prefix is highlighted. For example ipad d  query will replace black by dark and will highlight the first letter of dark: `**d**ark **ipad** 64GB`. This method allows to fully explain the results when the original word can be safely replaced by the matched synonym. 51 | 52 | For the second use case, we have added support for placeholders. You can add a 53 | specific token in your records that will be safely replaced by a set of words 54 | defined in your configuration. The highlighting mode that replaces the 55 | original word by the expansion totally makes sense here. For example if you 56 | have mission street  record with a placeholder = 57 | [ "1st", "2nd", ....] , then the query 1st missionstreet will replace 58 | by 1st  and will highlight all words: `**1st mission street**`. 59 | 60 | We believe this is a better way to handle synonyms and we hope you will like 61 | it :) We would love to get your feedback and ideas for improvement on this 62 | feature! Feel free to contact us at **hey(at)algolia.com**. 63 | 64 | -------------------------------------------------------------------------------- /_posts/2014-07-09-keeping-data-in-your-search-engine-up-to-date.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Keeping Data in your Search Engine Up-to-Date 4 | author: Julien 5 | --- 6 | 7 | When we developed the first version of Algolia Search, we put a lot of effort 8 | into developing a data update API. It worked like this: You could send us a 9 | modified version of your data as soon as the change appeared, even if it 10 | concerned only a specific part of a record. For example, this batch of 11 | information could be the updated price or number of reviews, and we would only 12 | update this specific attribute in your index. 13 | 14 | However, this initial plan did not take into account that most of our big 15 | customers would not benefit from this API due to their existing 16 | infrastructure. If you had not planned to catch all updates in your 17 | architecture, or if you were not using a framework like Ruby on Rails, it 18 | could be very difficult to even have a notification for any of these updates. 19 | The solution in this case was to use a batch update on a regular basis. It was 20 | a good method to use if you didn't want to change a single line of code in 21 | your existing infrastructure, but the batch update was far from a cure-all. 22 | 23 | ## The problem of batch update 24 | 25 | There are two main ways to perform a batch update on a regular basis: 26 | 27 | 1. Scan your database and update all objects. This method is good if you have no delete operation, but if some data are removed from your database, you will need to perform an extra check to handle delete, which can be very slow. 28 | 2. Clear the content of the index and import all your objects. With this method, you ensure that your index is well synchronized with your database. However, if you receive queries during the import, you will return partial results.  If interrupted, the whole rescan could break your relevance or your service. 29 | 30 | So the two approaches are somewhat buggy and dangerous. 31 | 32 | ## Another approach: build a new index with another name 33 | 34 | Since our API allows the creation of a new index with a different name, you 35 | could have made your batch import in a new index. Afterward, you would just 36 | need to update your front end to send queries to this new index. 37 | 38 | Since all indexing jobs are done asynchronously, we first need to check that 39 | an indexing job is finished. In order to do that, we return an integer (called 40 | TaskID) that allows you to check if an update job is applied. Thus, you just 41 | have to use the API to check that the job is indexed. 42 | 43 | But then a problem arises with mobile applications: You cannot change the 44 | index name of an application as easily, since most of the time, it is a 45 | constant in the application code. And even for a website, it means that the 46 | batch will need to inform your frontend that the index name is different. This 47 | can be complex. 48 | 49 | ## The elegant solution: move operation 50 | 51 | To solve these problems, we implemented a command that is well known on file 52 | systems: **move**. You can move your new index on the old one, and this will 53 | atomically update the content of the old index with the content of the new 54 | one. With this new approach, you can solve all the previous update problems 55 | with one simple procedure. Here's how you would update an index called 56 | "MyIndex": 57 | 58 | 1. Initialize an index "MyIndex.tmp" 59 | 2. Scan your database and import all your data in "MyIndex.tmp" 60 | 3. Move "MyIndex.tmp in "MyIndex" 61 | 62 | You don't have to do any modification on your backend to catch modifications, 63 | nor do you need to change the index name on the frontend. Even better, you 64 | don't need to check the indexing status with our TaskID system since the 65 | "move" operation will simply be queued after all "adds". All queries will go 66 | to the new index when it is ready. 67 | 68 | ## The beauty of the move command 69 | 70 | This command is so elegant that even customers who had been sending us 71 | realtime updates via our updates API have decided to use this batch update on 72 | a regular basis. The move command is a good way to ensure that there are no 73 | bugs in your update code, nor divergence between your database and Algolia. 74 | 75 | This operation is supported in our twelve API Clients. We go even further in 76 | our Ruby on Rails integration: You need only use the 'reindex' command 77 | (introduced in 1.10.5) to automatically build a new temporary index and move 78 | it on top of the existing one. 79 | 80 | The move command is an example of how we try to simplify the life of 81 | developers. If you see any other way we can help you, let us know and we'll do 82 | our best to remove your pain! 83 | 84 | -------------------------------------------------------------------------------- /_posts/2014-07-11-deploying-algolia-search-2-million-products.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Deploying Algolia to Search on more than 2 Million Products 4 | author: Maxime 5 | --- 6 | 7 | The following post is an interview of [Vincent Paulin][1], R&D Manager at [A Little 8 | Market][2] (recently acquired by Etsy). 9 | 10 | As a fast growing ecommerce site for handmade goods in France, A Little Market 11 | has seen its marketplace grow from a few thousand to over 2 million products 12 | in just 5 years. With 90,000 designers and artisans using A Little Market 13 | marketplace to buy, sell and collaborate, search quickly became a major part 14 | of their ecommerce strategy and user experience. 15 | 16 | #### **![ALittleMarket][3]** 17 | 18 | #### **What did you have in place as a search solution?** 19 | 20 | "We implemented a Solr based search 5 years ago and had been trying to tweak 21 | it to fit our growing needs.  We had selected this system for its flexibility, 22 | however, over time, that flexibility translated into constant maintenance, 23 | modifications and lower relevance in our search results. 24 | 25 | Then we investigated Elasticsearch. It is complex, yet powerful. As I was 26 | diving deeper into Elasticsearch I realized that I could quickly gain an "ok" 27 | search experience; however, a powerful search experience would mean investing 28 | more time than we had to configure it. Then I did a little math:  learning the 29 | platform would take a few weeks, configuring servers - a few days, and 30 | configuring and tuning semantic search perfectly - several months. 31 | 32 | Then we found Algolia.  We only had 3 months and knew Algolia would be much 33 | easier to implement, so we A/B tested everything to see how it would impact 34 | the search experience. 35 | 36 | #### **Can you tell us more about your integration process?** 37 | 38 | The first thing we wanted to get done was to reference all the shops and our 39 | best searches to make an autosuggest widget. Building this autosuggest with a 40 | basic configuration took us 2 days. 41 | 42 | Then we built an automatic task to aggregate shops and best searches every day 43 | and configure Algolia indices. We also took on the task to create the front 44 | javascript plugin. With the Algolia documentation and the examples on Github 45 | it took us less than 1 hour. 46 | 47 | The results of this first test were very encouraging.  With around 500k 48 | requests per day, the response time was about 4 milliseconds on average and we 49 | saw the conversion rate multiplied by 3 compared to the previous conversion 50 | rate with a search bar with "no suggest". For A Little Mercerie, another 51 | marketplace we manage, the improvement was about 4 times greater. 52 | 53 | After this first test, we were ready to fully commit to Algolia for our whole 54 | search experience. The first step was to create a script to index our entire 55 | product database in Algolia. This was easy to do with batch insert in Algolia 56 | indices. We selected some attributes of our products such as the title, 57 | categories, materials and colors to be indexed. That was a first try. We 58 | wanted it to be quick and simple. 59 | 60 | With the help of the open source demo code we developed a full JS sandbox 61 | which can display paginated results with faceting to show the progress to the 62 | team.  In less than a week, we had a fully working sandbox and the results 63 | were promising.  Our query time averaged less than 20 milliseconds on 2 64 | millions records.  With confidence we started to upgrade the algorithm on 65 | Algolia, test it, again and again, adding some attributes to index such as 66 | specific events (christmas, valentine's day), custom tags, etc. 67 | 68 | In addition, we implemented sorted results. They are really relevant with the 69 | new numeric ranking option in settings. At that step we were able to sort 70 | results by price, date, etc. You must create a specific index for each 71 | specific ranking you need.  We also created a different index for each 72 | language (French and Italian) and took this opportunity to do the same across 73 | our  other websites, alittlemercerie.com and alittleepicerie.com. 74 | 75 | To do this we created a custom API which abstracts the use of any kind of 76 | search engine for all API clients. We end up losing the real-time search but 77 | we need that for now in order to abstract everything and to collect data 78 | before sending the results. 79 | 80 | The next step was to erase the "no results" pages. For that, we were 81 | progressively adding the last words of the query as optional words until we 82 | had somes results.We never set as optional all the user queries.  We set at 83 | least the first word or the first two words. 84 | 85 | When search was ready, we still had plenty of time left to implement it on our 86 | clients' applications. We took more time than was needed to implement Algolia. 87 | The speed of iteration with the Algolia API enables us to test everything in a 88 | much shorter timeframe. 89 | 90 | #### **How has Algolia's API helped search on A Little Market?** 91 | 92 | We are now able to answer more than 500/1000 requests per minute and we add 93 | 6000 new products every day to the search engine while over 3000 are removed, 94 | in real time. 95 | 96 | After this integration of the Algolia API, we saw an increase in our 97 | conversion rate on search by 10%. This represents tens thousands of euros in 98 | turnover per month for us. In a few weeks of work with one engineer, we had 99 | replaced our main search engine for a better solution thanks to Algolia." 100 | 101 | 102 | [1]: https://fr.linkedin.com/pub/vincent-paulin/71/1a3/86a 103 | [2]: http://www.alittlemarket.com/ 104 | [3]: ./assets/Capture-decran-2014-07-11-17.31.04-1024x486.png 105 | -------------------------------------------------------------------------------- /_posts/2014-08-21-algolia-for-realtime-expense-reporting.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: How Abacus Leverages Algolia for Realtime Expense Reporting 4 | author: Kevin 5 | --- 6 | 7 | When one thinks of expense reporting, speed is far from the first descriptor 8 | that comes to mind. Companies spend a substantial amount of time tracking 9 | expenses, while employees linger in paperwork purgatory, wondering when they 10 | will be reimbursed for their work-related charges. That's why Abacus has made 11 | it their mission to simplify expense management so that it occurs in real 12 | time. Their creative implementation of Algolia helps make it happen. 13 | 14 | Abacus is a mobile and desktop application that allows small businesses to 15 | track and verify expenses on the go. Employees can upload a photo of their 16 | receipt on the mobile app, and Abacus takes care of the rest. "For each 17 | expense, we have a lot of data. We have the person who expensed it, the amount 18 | of the expense, the time, and where it took place. We also have a lot of 19 | metadata. For example, if you went out to breakfast, we pull in the name of 20 | the restaurant, the address, the URL of the merchant. There's tags and 21 | categories and so on," explains Ted Power, Co-Founder of Abacus. "And we 22 | wanted to make all of that searchable." 23 | 24 | [![Abacus Algolia][1]](https://blog.algolia.com/wp- 25 | content/uploads/2014/08/Screen-Shot-2014-08-14-at-16.37.25.png) 26 | 27 | To make all of that data accessible and interpretable for a financial manager, 28 | Abacus turned to our API. "Algolia made it super easy for us to get faceted, 29 | advanced search options. If you are the finance person at your company, you 30 | can basically say 'Show me all of the expenses over $50,' or 'Show me all the 31 | expenses that don't have a receipt.' You can look at expenses for one person 32 | or one category, like travel. You can even pivot off of 8 of these different 33 | things. Algolia makes it super easy to do," says Power. This accelerates the 34 | process of expense verification and approval. "It's good search. We have tags 35 | like 'car rental' on auto-complete, for example. That's all Algolia." 36 | 37 | Power adds that a "great implementation experience" was especially beneficial 38 | for the start up. "It's the kind of thing that would have taken ages to build 39 | from scratch." Co-Founder Joshua Halickman chimed in: "Being able to get up 40 | and off the ground really quickly was great. In general, I love the speed. 41 | Crazy fast. Really nice." 42 | 43 | [![Abacus Algolia][2]](https://blog.algolia.com/wp- 44 | content/uploads/2014/08/Screen-Shot-2014-08-14-at-16.38.34.png) 45 | 46 | _Images courtesy of Abacus. Learn more _[_on their 47 | website._][3] 48 | 49 | 50 | [1]: ./assets/Screen-Shot-2014-08-14-at-16.37.25.png 51 | [2]: ./assets/Screen-Shot-2014-08-14-at-16.38.34.png 52 | [3]: https://www.abacus.com 53 | -------------------------------------------------------------------------------- /_posts/2014-08-28-concertwith-mes-competitive-edge-revamped-search-ux-algolia.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'Concertwith.me''s Competitive Edge: A Revamped Search UX with Algolia' 4 | author: Kevin 5 | --- 6 | 7 | There are a lot of music discovery apps on the market, yet sifting through 8 | concert listings is anything but seamless. That's why Cyprus-based startup 9 | [Concertwith.me][1] aims to make finding local concerts 10 | and festivals as intuitive as possible. Automatically showing upcoming events 11 | in your area, the site offers personalized recommendations based on your 12 | preferences and your Facebook friends' favorited music. Covering over 220,000 13 | events globally, the site uses Algolia to offer meaningful results for 14 | visitors who are also looking for something different. 15 | 16 | Founder Vit Myshlaev admits that concert sites often share the same pool of 17 | information. The differentiator is how that information is presented. "The 18 | biggest advantage one can have is user experience," he explains. "There's 19 | information out there, but do users find it? The reason that people don't go 20 | to cool concerts is that they still don't know about them!" 21 | 22 | As an example, he showed me one of the largest live music discovery sites on 23 | the web. Searching for an artist required navigating a convoluted maze of 24 | links before pulling up irrelevant results. "Users have to type in queries 25 | without autocomplete, typo-tolerance, or internationalization. They have to 26 | scroll through a long list of answers and click on paginated links. That's not 27 | what people want in 2014," said Myshlaev. 28 | 29 | To simplify search and make the results more relevant, Concertwith.me used our 30 | API. "We got a lot of user feedback for natural search," Myshlaev wrote. Now 31 | visitors can search for artists and concerts instantly. With large user bases 32 | in the United States, Germany, France, Spain, Italy, Russia and Poland, 33 | Concertwith.me also benefits from Algolia's [multi-lingual search 34 | feature][2]. "We've localized our app 35 | to many countries. For example, you can search in Russian or for artists that 36 | are Russian, and results will still come up," says Myshlaev. 37 | 38 | [![search][3]](https://blog.algolia.com/wp- 39 | content/uploads/2014/08/search.gif) 40 | 41 | For users with a less targeted idea of what they're looking for, 42 | Concertwith.me implemented structured search via 43 | [faceting][4]. "We also realized 44 | that some visitors don't know what they want. Algolia search helps them find 45 | answers to questions like, Where will my favorite artist perform? How much do 46 | tickets cost? Are there any upcoming shows?" 47 | 48 | [![recommendations][5]](https://blog.algolia.com/wp- 49 | content/uploads/2014/08/recommendations.gif) 50 | 51 | Concertwith.me's goal is to reduce informational noise so that users can find 52 | and discover music as soon as possible. The start up experimented with a 53 | number of other search technologies before reading an [article about us on 54 | Intercom.io][6], which 55 | inspired Myshlaev. "When I saw what Algolia could do, I knew that this was the 56 | competitive edge I was looking for." 57 | 58 | **_Want to build a search bar with multi-category auto-completion like Concertwith.me? [Learn how through our tutorial][7]._** 59 | 60 | 61 | [1]: http://concertwith.me/ 62 | [2]: https://www.algolia.com/doc#Multilingual 63 | [3]: ./assets/search.gif 64 | [4]: http://faq.algolia.com/basics/what-is-faceting/ 65 | [5]: ./assets/recommendations.gif 66 | [6]: http://insideintercom.io/7-things-wish-every-search-did/ 67 | [7]: https://www.algolia.com/doc/tutorials 68 | -------------------------------------------------------------------------------- /_posts/2014-09-01-4th-datacenter-california.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Algolia opened its 4th datacenter is in California! 4 | author: Nicolas 5 | --- 6 | 7 | Do you know the 3 most important things in search? Speed, speed, and speed! 8 | 9 | At Algolia, we work at making access to content and information completely 10 | seamless. And that can only be done if search results are returned so fast 11 | that they seem instant. 12 | 13 | That means two things for us: getting server **response time under 10ms** 14 | (checked), and getting the servers close to end-users to lower latency. 15 | 16 | We are on a quest to make search faster than 100ms from anywhere in the world, 17 | and today is an important step. We are thrilled to announce the **opening of 18 | our 4th datacenter, located in California**! 19 | 20 | You can now choose to be hosted on this datacenter when [signing 21 | up](https://www.algolia.com/users/sign_up) (multi-datacenter distribution is 22 | also available for enterprise users). 23 | 24 | -------------------------------------------------------------------------------- /_posts/2014-10-10-aftership-leverages-algolias-search-service-track-10-million-packages-around-world.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: AfterShip Leverages Algolia's Search as a Service to Track 10 Million Packages Around The World 4 | author: Marie-Auxille 5 | --- 6 | 7 | Algolia Speeds Up Search Result Delivery Times From 10 Seconds To 250 8 | Milliseconds.The following post is a guest post by [Teddy 9 | Chan][1], Founder and CEO at 10 | [AfterShip][2]. 11 | 12 | ![Teddy Chan AfterShip][3] 13 | 14 | AfterShip is an online tracking platform which helps online merchants track 15 | their shipment across multiple carriers and notify their customers via email 16 | or mobile. Being an online merchant myself, I shipped more than 30,000 17 | packages a month around the world. When customers contacted me to get an 18 | update on shipments I realized that I couldn't track shipments from different 19 | carriers and get updates on their status in a single place. So I built 20 | Aftership to allow both consumers and online merchants view all their packages 21 | on a single platform. 22 | 23 | After winning the 2011 Global Startup Battle and 2011 Startup Weekend Hong 24 | Kong Aftership opened into beta and quickly helped thousands of online 25 | merchants to send out over 1,000,000 notifications to customers. 26 | 27 | One of the key parts of our service is providing customers around the world 28 | with up-to-date information about their packages. 29 | 30 | Right now we have more than 10 million tracking numbers in our database. This 31 | causes a few different challenges when it comes to search and we needed 32 | technology that would help us continuously index constantly changing 33 | information. 34 | 35 | ### Our first challenge is that we are a small team with only 1 engineer. 36 | 37 | We are not in the search business, so we needed a solution that would be easy 38 | to implement and work well with our existing infrastructure. Algolia's 39 | extensive documentation made it easy to see that our set up and implementation 40 | time would be extremely fast and would work with any language and database, so 41 | we could get back to our core business. 42 | 43 | **Algolia was super easy, we had it tested, up and running in a week.** 44 | 45 | ### Our second challenge was quickly delivering search results. 46 | 47 | On Redis, searching for packages was simply impossible. For each query, it 48 | would simply lock up until the result was found, so it could run only one 49 | search at a time. Each search with Redis was taking up to 10 seconds. **With 50 | Algolia we reduced search result delivery times to 250 milliseconds for any 51 | customer anywhere in the world.** When you think about thousands of merchants 52 | who send more than 1 million packages per month, you can see how speed is 53 | critical. 54 | 55 | Downtime also is not an option when tracking packages around the globe. 56 | 57 | We are very strict when adopting new technologies and SaaS technologies can't 58 | slow down our system. 59 | 60 | **Algolia had the highest uptime of the other solutions we looked at. There was no physical downtime.** 61 | 62 | ### Our final challenge was search complexity. 63 | 64 | Sometimes you need to know how many shipments are coming from Hong Kong and 65 | exactly where they are in transit to and from the U.S.. Shipments going around 66 | the globe can change status several times within a single day. With Algolia's 67 | indexing we are able to instantly deliver up-to-date notifications on all 10 68 | million packages, so that customers can not only track their package on its 69 | journey, but they can also go to their online merchant's shop and see a real- 70 | time status of their package. 71 | 72 | **In the end, it was Algolia's customer service that won us over.** 73 | Similar services and platforms were not responsive. With Algolia we either had 74 | the documentation we needed, immediately were able to get advice from an 75 | engineer or had our problem solved in less than a day. With such a small team 76 | this means a lot. And with the Enterprise package we know that Algolia will 77 | grow with us as quickly as our business does. 78 | 79 | **Want to find out more about the Algolia experience ? 80 | [ Discover and try it here ][4]** 81 | 82 | 83 | [1]: http://hk.linkedin.com/in/teddychan/ 84 | [2]: https://www.aftership.com/ 85 | [3]: ./assets/teddy.png 86 | [4]: https://www.algolia.com/features 87 | -------------------------------------------------------------------------------- /_posts/2014-11-14-jadopado-delivers-instasearch-mobile-web-powered-algolia.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Jadopado delivers instasearch for mobile and web powered by Algolia 4 | author: Marie-Auxille 5 | --- 6 | 7 | ## Algolia Increases Online Search Sessions By 60% and Unique Mobile Searches 8 | by 270% 9 | 10 | **The following post is a guest post by Omar Kassim, co-founder of [JadoPado][1].** 11 | 12 | ![Omar-Kassim-Founder-of-JadoPado][2] Founded in 2010, JadoPado is one of the largest e-commerce 13 | sites servicing the GCC, Middle East, North Africa and South Asia.  Its CEO 14 | Omar Kassim wanted to bring an Amazon-like experience to the region.  In just 15 | 3 years of operations the company now boasts thousands of customers, hundreds 16 | of vendors and over $7 million in annual revenues. 17 | 18 | **Realizing that search is a key component of their user experience and engagement**, Omar and his small team of 15 set off to build new search capabilities that would help users find the products they wanted, lightning fast. In addition, the team was developing a revamped mobile experience and saw that search needed to be spot on for both smartphones and tablets. _"I saw search as a competitive tool and as a strategy to get a leg up on our competition.  After seeing Algolia on Hacker News I was absolutely blown away.  After looking at the demos, we threw out what we were doing internally in terms of a small search revamp and I had one of our team get cracking with Algolia right away. As a little startup, it really helped that Algolia's price points were within reach in terms of not breaking the bank to get things rolling."_ 19 | 20 | ### The Power of Instant Search 21 | 22 | After configuring and testing Algolia for two weeks, JadoPado had the results 23 | they were looking for. Branded internally as InstaSearch, JadoPado knew that 24 | it would dramatically improve how search functioned on both mobile and the web 25 | at JadoPado. _"The idea from the outset was to build InstaSearch. I kept 26 | ending up at the Algolia demo and **thought it would be incredible if we could 27 | forget all user interaction aside from typing and just display results right 28 | away**. Remove what you've typed and the results disappear taking you back to 29 | where you were. We then spent a bit of time figuring out how to get each 30 | result "page" to have a URL that could be used with external search or shared 31 | elsewhere,"_ explained Omar. 32 | 33 | ![japopado ecommerce][3] 34 | 35 | ### Making Search Seamless 36 | 37 | _"We looked at a number of solutions. **One of our biggest intentions was to 38 | try to get search to be extremely fast and as slick as possible**. Customers 39 | should feel like search "just works" and that it is a super easy way to get 40 | straight to to whatever they may be looking for. Algolia has allowed us to 41 | accomplish that,"_ Omar explained.  _"**Moving search from a not really 42 | working internal model to a search as a service platform** has allowed us to 43 | focus on other areas while knowing that search works and that we've got an 44 | edge over our competition."_ 45 | 46 | ### Support For Arabic 47 | 48 | With more than 20 countries to support, the JadoPado team knew that the key to 49 | success in the region was to ensure that search be delivered in Arabic as 50 | well. Omar explained, _"The final bits were figuring out a separate set of 51 | indexes for Arabic (as we were about to roll out a standalone Arabic version 52 | of JadoPado) and getting the faceting right. This was easy to do with the deep 53 | Algolia documentation."_ **Algolia works with all languages, including 54 | Chinese, Japanese, Korean, and Arabic. No specific configuration required, 55 | speed and ranking perform exactly the same way**. 56 | 57 | ### Better Business Through Search 58 | 59 | In May the team rolled out InstaSearch, Arabic support and a newly revamped 60 | mobile experience with search at the center. JadoPado immediately experienced 61 | a doubling in conversions and activity that was triple a typical day. 62 | **Compared to the same 30 day period in 2013, JadoPado saw an increase in site 63 | visits through search from 8.2% to 11.3%.** 64 | 65 | Additionally: 66 | 67 | * Sessions with search has jumped 59.96%. 68 | * Unique searches has jumped 46.87% 69 | * Average search depth has increased by 58.87%. 70 | 71 | ### Mastering Mobile Through Search 72 | 73 | **The greater impact of Algolia's hosted search was JadoPado's revamped mobile experience**. Search is often the first action customers take on a mobile device.  With instant search, autocorrect and full language support,  improving search and the quality of results can have a significant impact on revenues.  With Algolia implemented as part of JadoPado's mobile site, the company saw strong results with **visits from search increasing from 4.3% to 15% over the same time period and session exits decreasing by 16.57%.** A big change. And **search increased engagement on all levels**: 74 | 75 | * Mobile sessions with search jumped by 233.92% 76 | * Total unique mobile searches jumped 268.37% 77 | * Average search depth on mobile devices jumped by 41.05%. 78 | 79 | _Images courtesy of JadoPado. Learn more on their 80 | [website][4]._ 81 | 82 | 83 | [1]: https://jadopado.com/ 84 | [2]: ./assets/Omar-Kassim-Founder-of-JadoPado-Image-2-1.jpg 85 | [3]: ./assets/jadopado.gif 86 | [4]: https://jadopado.com/ 87 | -------------------------------------------------------------------------------- /_posts/2014-12-01-fanfootage-solving-search-problem-algolia.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: 'FanFootage: Solving the Search problem with Algolia' 4 | author: Marie-Auxille 5 | --- 6 | 7 | **The following post is a guest post by Eoin O'Driscoll (web developer), and Vinny Glennon (co-founder) of FanFootage.com** 8 | 9 | ![vinny][1] 10 | 11 | ![eoin-o-driscoll][2] 12 | 13 | When we founded FanFootage we knew there was something lacking in the concert 14 | and event experience. Fans were taking videos on their mobile phones during 15 | performances, loading them on YouTube, and the audio was horrible. So we 16 | created FanFootage where fans can upload their own video and we work with the 17 | bands to get the high def audio and put them together. Now fans can come to 18 | our site and see their favorite concerts or sports from any angle. They can 19 | also search for upcoming events and performances. 20 | 21 | For a recent Linkin Park concert the band and the fan group contacted us. 22 | Their fans uploaded more than 1,500 videos from almost every angle. On 23 | FanFootage that single concert has had over 350,000 page views. 24 | 25 | ![fanfootage][3] 26 | 27 | ## Our user experience heavily relies on search 28 | 29 | Earlier in our design **we knew that search would be key to making FanFootage 30 | the ultimate fan experience**. **When a user comes to our site the first thing 31 | they do is search for the event or artist. And we need to make sure that they 32 | either find the artist they are looking for or something similar, and it has 33 | to be fast**. 34 | 35 | As developers, our team isn't new to search, particularly within the 36 | entertainment space. Our previous startup in the music space was bought by 37 | RealNetworks and a second startup was a competitor to Google. That is where we 38 | learned that search is hard. And when we thought to build our own search on 39 | FanFootage we quickly said it wasn't going to happen. 40 | 41 | We also know what fans need. **User demands have changed now that they can 42 | access anything from their phones. Today we expect our applications and 43 | services to predict what we are going to do next. And because of Google, 44 | people don't search with a single phrase. Users expect search to understand 45 | how phrases fit together and are related and of course it needs to spell check 46 | and it must be instant**. 47 | 48 | We also had different search requirements than other sites. Normally search on 49 | a site is for one unit or concept; a site for flowers for example. For us we 50 | needed to allow fans to search for artists, bands, friends or upcoming events 51 | in their area and never get a zero result. 52 | 53 | ## Why we chose Algolia 54 | 55 | After looking at a few search applications we agreed on Algolia.**Many search 56 | applications look nice but don't have the flexibility we needed** to configure 57 | them they way our business needed. And most weren't fast. 58 | 59 | Why did we chose Algolia? First it has **a developer-centric approach**. It 60 | took us 2 hours to configure and a day to test and that was it. We basically 61 | had search up and running in a day. The dashboard lets me know that the API 62 | calls are returned within milliseconds and we have all the flexibility we need 63 | to configure as our content grows. 64 | 65 | Today, more than 250 artists have used FanFootage in 20 countries. We are 66 | growing quickly. As a company we are still learning what our fans are 67 | searching for and Algolia is helping us with that. **As content grows we will 68 | continue to configure search to meet the needs of our fans**. We will also be 69 | rolling out Algolia for mobile because of its multi-search capabilities. 70 | 71 | Algolia is a simple solution to a complex problem. And it blew our mind away. 72 | It just works. And now we can focus on our own fanbase. 73 | 74 | _Images courtesy of FanFootage. Learn more on their 75 | [website][4]_ 76 | 77 | 78 | [1]: ./assets/vinny.png 79 | [2]: ./assets/eoin-o-driscoll.png 80 | [3]: ./assets/fanfootage.gif 81 | [4]: https://fanfootage.com/ 82 | -------------------------------------------------------------------------------- /_posts/2014-12-23-christmas-gifthub-awesome-autocomplete.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Github Awesome Autocomplete browser extension for Chrome and Firefox 4 | author: Sylvain 5 | --- 6 | 7 | By working every day on building the best search engine, we've become obsessed 8 | with our own search experience on the websites and mobile applications we use. 9 | 10 | We're git addicts and love using GitHub to store every single idea or project 11 | we work on. We use it both for our private and public repositories ([12 API 12 | clients][1], [HN 13 | Search][2] or various 14 | [d][3] 15 | [e][4] [m][5] [o][6] 16 | [s][7]. We use every day its search 17 | function and we decided to re-build it the way we thought it should be.  We're 18 | proud to share it with the community via this [Chrome 19 | extension][8]. Our Github Awesome Autocomplete 20 | enables a seamless and fast access to GitHub resources via an as-you-type 21 | search functionality. 22 | 23 | ## Install your Christmas Gift now! 24 | 25 | [![Github Awesome Autocomplete Algolia Search][9]](https://chrome.google.com/webstore/detail/github-awesome- 26 | autocomple/djkfdjpoelphhdclfjhnffmnlnoknfnd) 27 | 28 | ## Features 29 | 30 | The Chrome extension replaces GitHub's search bar and add autocomplete 31 | capabilities on: 32 | 33 | * top public repositories 34 | 35 | * last active users 36 | 37 | * your own private repositories (this one is done locally in JavaScript without Algolia: the list of private repositories remains locally in your browser) 38 | 39 | ![][10] 40 | 41 | ## How does it work? 42 | 43 | We continuously retrieve the most watched repositories and the last active 44 | users using [GitHub Archive][11] dataset. Users and 45 | repositories are stored in 2 Algolia indices: users and repositories. The 46 | queries are performed using [our JavaScript API 47 | client][12] and the 48 | autocomplete menu is based on Twitter's 49 | [typeahead.js][13] library. 50 | 51 | The underlying Algolia account is replicated in 6 regions using our 52 | [DSN][14] feature, answering every query in 50-100ms 53 | wherever you are (network latency included!). Regions include US West, US 54 | East, Europe, Singapore, Australia & India. 55 | 56 | ## Exporting the records from GitHub Archive 57 | 58 | We used GitHub's Archive dataset to export top repositories and last active 59 | users using Google's BigQuery: 60 | 61 | 62 | ;; export repositories 63 | SELECT 64 | a.repository_name as name, 65 | a.repository_owner as owner, 66 | a.repository_description as description, 67 | a.repository_organization as organization, 68 | a.repository_watchers AS watchers, 69 | a.repository_forks AS forks, 70 | a.repository_language as language 71 | FROM [githubarchive:github.timeline] a 72 | JOIN EACH 73 | ( 74 | SELECT MAX(created_at) as max_created, repository_url 75 | FROM [githubarchive:github.timeline] 76 | GROUP EACH BY repository_url 77 | ) b 78 | ON 79 | b.max_created = a.created_at and 80 | b.repository_url = a.repository_url 81 | 82 | 83 | ;; export users 84 | SELECT 85 | a.actor_attributes_login as login, 86 | a.actor_attributes_name as name, 87 | a.actor_attributes_company as company, 88 | a.actor_attributes_location as location, 89 | a.actor_attributes_blog AS blog, 90 | a.actor_attributes_email AS email 91 | FROM [githubarchive:github.timeline] a 92 | JOIN EACH 93 | ( 94 | SELECT MAX(created_at) as max_created, actor_attributes_login 95 | FROM [githubarchive:github.timeline] 96 | GROUP EACH BY actor_attributes_login 97 | ) b 98 | ON 99 | b.max_created = a.created_at and 100 | b.actor_attributes_login = a.actor_attributes_login 101 | 102 | 103 | ## Configuring Algolia indices 104 | 105 | Here are the 2 index configurations we used to build the search: 106 | 107 | ### Repositories 108 | 109 | ![][15] 110 | 111 | ### Users 112 | 113 | ![][16] 114 | 115 | ### 116 | 117 | ## Want to contribute? 118 | 119 | It's open-source and we'll be happy to get your feedback! Just use [GitHub's 120 | issues][17] to 121 | report any idea you have in mind. We also love pull-requests :) 122 | 123 | Source code: [https://github.com/algolia/github-awesome- 124 | autocomplete](https://github.com/algolia/github-awesome-autocomplete) 125 | 126 | Install it now: [Github Awesome Autocomplete on Google Chrome Store 127 | [FREE][18]] 128 | 129 | ## Or just want to add an instant search in your website / application? 130 | 131 | Feel free to create a 14-days FREE trial at 132 | [http://www.algolia.com](http://www.algolia.com/) and follow one of our step 133 | by step tutorials at 134 | [https://www.algolia.com/doc/tutorials](https://www.algolia.com/doc/tutorials) 135 | 136 | 137 | [1]: https://www.algolia.com/doc/apiclients 138 | [2]: https://github.com/algolia/hn-search 139 | [3]: https://github.com/algolia/instant-search-demo 140 | [4]: https://github.com/algolia/facebook-search 141 | [5]: https://github.com/algolia/linkedin-search 142 | [6]: https://github.com/algolia/meetup-search 143 | [7]: https://github.com/algolia/twitter-search) 144 | [8]: https://chrome.google.com/webstore/detail/github-awesome-autocomple/djkfdjpoelphhdclfjhnffmnlnoknfnd 145 | [9]: ./assets/ChromeWebStore_BadgeWBorder_v2_206x58.png 146 | [10]: ./assets/hackpad.com_Y3thzadEtdY_p.233467_1419338581444_capture.gif 147 | [11]: http://www.githubarchive.org/ 148 | [12]: https://github.com/algolia/algoliasearch-client-js 149 | [13]: http://twitter.github.io/typeahead.js/ 150 | [14]: https://www.algolia.com/dsn 151 | [15]: ./assets/hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen%20Shot%202014-12-23%20at%2013.46.04.png 152 | [16]: ./assets/hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen%20Shot%202014-12-23%20at%2013.45.54.png 153 | [17]: https://github.com/algolia/github-awesome-autocomplete/issues 154 | [18]: https://chrome.google.com/webstore/detail/github-awesome-autocomple/djkfdjpoelphhdclfjhnffmnlnoknfnd 155 | -------------------------------------------------------------------------------- /_posts/2015-02-18-distributed-search-network-latency-ruins-search-experience.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Don't let network latency ruin the search experience of your international users 4 | author: Marie-Auxille 5 | --- 6 | 7 | At Algolia, we allow developers to provide a unique interactive search 8 | experience with as-you-type search, instant faceting, mobile geo-search and on 9 | the fly spell check. 10 | 11 | Our Distributed Search Network aims at removing the impact of network latency 12 | on the speed of search, allowing our customers to offer this instant 13 | experience to all their end-users, wherever they may be. 14 | 15 | ## Every millisecond matters 16 | 17 | We are obsessed with speed and we're not the only ones: Amazon found out that 18 | 100ms in added latency cost them 1% in sales. [The lack of responsiveness for 19 | a search engine can really be damaging for one's 20 | business][1]. As 21 | individuals, we are all spoiled when it comes to our search expectations: 22 | Google has conditioned the whole planet to expect instant results from 23 | anywhere around the world. 24 | 25 | ![user-experience][2] 26 | 27 | We have the exact same expectations with any online service we use. The thing 28 | is that for anyone who is not Google, **it is just impossible to meet these 29 | expectations** because of the network latency due to the physical distance 30 | between the service backend that hosts the search engine and the location of 31 | the end-user. 32 | 33 | Even with the fastest search engine in the world, it can still take hundreds 34 | of milliseconds for a search result to reach Sydney from San Francisco. And 35 | this is without counting the bandwidth limitations of a saturated oversea 36 | fiber! 37 | 38 | ## How we beat the speed of light 39 | 40 | Algolia's Distributed Search Network (DSN) removes the latency from the speed 41 | equation by **replicating your indices to different regions around the world, 42 | where your users are**. 43 | 44 | Your local search engines are clones synchronized across the world. DSN allows 45 | you to **distribute your search among 12 locations** including the US, 46 | Australia, Brazil, Canada, France, Germany, Hong Kong, India, Japan, Russia, 47 | and Singapore. Thanks to our 12 data centers, your search engine can now 48 | **deliver search results under 50ms in the world's top markets**, ensuring an 49 | optimal experience for all your users. 50 | 51 | ![DSN-b3ce122c790c492c2f2c8ddbabaae464][3] 52 | 53 | ## How you activate DSN 54 | 55 | Today, DSN is only accessible to our Starter, Growth, Pro and Enterprise plan 56 | customers. To activate it, you simply need to go in the **"Region" tab at the 57 | top of your Algolia dashboard and select "Setup DSN"**. 58 | 59 | [![shot][4]](https://www.algolia.com/dsn/setup) 60 | 61 | You will then be displayed with a map and a selection of your top countries in 62 | terms of search traffic. Just **select our DSN data centers on the map and see 63 | how performance in those countries is optimized**. 64 | 65 | Algolia will then automatically take care of the distribution and the 66 | synchronization of your indices around the world. End-users' queries will be 67 | automatically routed to the closest data center among those you've selected, 68 | ensuring the best possible experience. Algolia DSN delivers an ultra low 69 | response time and automatic fail-over on another region if a region is down. 70 | 71 | [![][5]](https://www.algolia.com/dsn/setup) 72 | 73 | It is that simple! 74 | 75 | Today, several services including HackerNews, TeeSpring, Product Hunt and 76 | Zendesk are leveraging **Algolia DSN to provide faster search to their global 77 | users**. 78 | 79 | Want to find out more about the Algolia experience ? 80 | 81 | [Discover and try it here][6]! 82 | 83 | 84 | [1]: http://glinden.blogspot.fr/2006/11/marissa-mayer-at-web-20.html 85 | [2]: ./assets/user-experience.jpg 86 | [3]: ./assets/DSN-b3ce122c790c492c2f2c8ddbabaae464.jpg 87 | [4]: ./assets/shot.jpg 88 | [5]: ./assets/dsn-shot.jpg 89 | [6]: https://www.algolia.com/features 90 | -------------------------------------------------------------------------------- /_posts/2015-04-20-quadrant-io-solves-the-frustration-of-economic-data-search-with-algolia.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Quadrant.io solves the frustration of economic data search with Algolia 4 | author: Marie-Auxille 5 | --- 6 | 7 | Browsing the cumbersome interfaces of government websites in the lookout for 8 | reliable data can be a very frustrating experience. It's full of specific 9 | terminology and there's not a government website that looks the same. It's 10 | like each time you want to use a car, you have to learn to drive all over 11 | again. 12 | 13 | ## Connect ideas with economic insight in a matter of seconds 14 | 15 | That's what [Quadrant.io][1] is for. 16 | Solving the frustration anyone who makes their points with facts encounters 17 | when routinely performing data search. It offers them with the fastest and 18 | easiest way to find and chart economic data from trusted sources. 19 | Acknowledging that it can quickly become a nightmare to find reliable 20 | information scattered all over the web, 21 | [Quadrant][2] is on a mission to **shorten 22 | any data search to seconds**. **So that data users can spend less time finding 23 | data and more time analysing it.** 24 | 25 | To keep this promise, Quadrant provides data users with an intuitive platform 26 | that aggregates more than 400,000 indicators from over 1,000 public sources, 27 | and keep them updated in real time. **A powerful search allowing any user to 28 | find exactly what they are looking for even if they do not use economists' 29 | jargon** is a must-have functionality in such a service. 30 | 31 | And Algolia stood out as the perfect search solution for Quadrant. 32 | 33 | ## Provide a rewarding search experience to End-Users 34 | 35 | First because of** the rewarding search experience it allows to deliver to its 36 | users.** 37 | 38 | Algolia surfaces data relevant to people's search in milliseconds, showing the 39 | most appropriate results from the very first keystroke. 40 | 41 | ![searchquadrant1][3] 42 | 43 | It enables to search across different entry points corresponding to the 44 | different attributes describing data series (release date, source). 45 | 46 | ![Screen-Shot-2015-04-13-at-18.06.28][4] 47 | 48 | That wasn't possible with other search solutions they tested before. After 49 | implementing Algolia, Quadrant.io received nice feedback from their customers, 50 | saying that "search was much more comfortable, much more intuitive". 51 | 52 | ## Algolia empowers anyone to be a search expert 53 | 54 | Second, because of the simple experience it is to deploy Algolia on their web 55 | app. Back-end documentation and customer support was a major help: it took 56 | them __less than a week to implement instant search__, including relevance 57 | tweaking and front-end development. As Dane Vrabrac, co-founder of Quadrant.io 58 | concluded "with Algolia, it's awesome all the stuff I can do as a non 59 | developer !" 60 | 61 | _Images courtesy of Quadrant.io. Learn more on their 62 | [website][5]._ 63 | 64 | 65 | [1]: https://www.quadrant.io/find/#/search 66 | [2]: https://www.quadrant.io/find/#/search 67 | [3]: ./assets/searchquadrant1.gif 68 | [4]: ./assets/Screen-Shot-2015-04-13-at-18.06.28.png 69 | [5]: https://quadrant.io/ 70 | -------------------------------------------------------------------------------- /_posts/2015-05-11-dns-fallback-for-better-resilience.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: DNS fallback for better resilience 4 | author: Adam 5 | --- 6 | 7 | At Algolia, we are obsessed with finding a way to have a 99.9999% available 8 | architecture. On our way to achieve that, we have to make sure every piece of 9 | the architecture can safely fail without affecting the service. 10 | 11 | The first point of the architecture where a customer's request starts to 12 | interact with our service is not the router in the datacenter, but a DNS 13 | resolving a domain name to the IP address "long time" before that. This piece 14 | of architecture is very often overlooked and that is no surprise as you mostly 15 | get best-effort DNS service automatically with your server. 16 | 17 | ## Latency 18 | 19 | For couple months we are a happy user of [NSONE][1] that 20 | provides us with the first level of logic. We use NSONE for its superb 21 | performance and data-driven DNS that gives us control in steering the traffic 22 | of our [Distributed Search Network][2] to the proper 23 | server - whether it means closest or simply available one. But as any other 24 | network dependent service, there are factors outside of NSONE's control that 25 | can influence availability of its DNS resolves and consequently Algolia. BGP 26 | routing is still a huge magic and "optimizations" of some ISPs are beyond 27 | understanding. Well, they do not always make the optimizations in the 28 | direction we would like to. For some services the change of DNS resolution 29 | time from 10 to 500ms does not mean a lot but for us it is a deal breaker. 30 | 31 | [![nsone-dig-latency][3]](https://blog.algolia.com/wp-content/uploads/2015/05/nsone-dig-latency.png) Resolution of latency-1 via NSONE 32 | 33 | ## DDoS 34 | 35 | When we started to think about our DNS dependency, we remembered the [2014 36 | DDoS attack on UltraDNS][4] and the situation when there was not enough 37 | [#hugops][5] for all the services impacted. 38 | During the previous [attack on UltraDNS in 2009][6] even 39 | big names like Amazon and SalesForce got impacted. 40 | 41 | ## Solution 42 | 43 | In most of the cases it would mean adding another DNS name server from a 44 | different provider and replicate the records. But not in ours. NSONE has some 45 | unique features that we would have to give up and find a common feature subset 46 | with a different provider. In the end we would have to serve a portion of DNS 47 | resolutions via slower provider for no good reason. 48 | 49 | Since we provide custom made API clients we have one more place where to put 50 | additional logic. Now came a time to choose a resilient provider for our 51 | secondary DNS and since we like AWS, Route53 was a clear choice. Route53 has 52 | ok performance, many POPs around the world and API we already had integration 53 | for. 54 | 55 | In the last moment, one more paranoid idea came to us - let's not rely on a 56 | single [TLD][7]. No good reason 57 | for that, it was just "what if...?" moment. 58 | 59 | [![route53-dig-latency][8]](https://blog.algolia.com/wp-content/uploads/2015/05/route53-dig-latency.png) Resolution of latency-1 via 60 | Route53 61 | 62 | Right now, all the latest versions of our API clients (detailed list below) 63 | use multiple domain names. "algolia.net" is served by NSONE and provides all 64 | the speed and intelligence, "algolianet.com" is served by Route53 in case that 65 | for any reason contacting server via "algolia.net" fails. It brings more work 66 | to our side, brings more cost on our side but it also brings better sleep for 67 | our customers, their customers and us. 68 | 69 | And now we can think what else can fail... 70 | 71 | Minimal versions of API clients with support of multiple DNS: 72 | 73 | * [Javascript v2: 2.9.6](https://github.com/algolia/algoliasearch-client-js/releases/tag/2.9.6) 74 | * [Javascript v3: 3.1.0](https://github.com/algolia/algoliasearch-client-js) 75 | * [Node.js: 1.8.0](https://github.com/algolia/algoliasearch-client-node) 76 | * [Ruby: 1.4.1](https://github.com/algolia/algoliasearch-client-ruby) 77 | * [Ruby on rails: Ruby dependency 1.4.1](https://github.com/algolia/algoliasearch-rails) 78 | * [Python: 1.5.2](https://github.com/algolia/algoliasearch-client-python) 79 | * [PHP: 1.5.5](https://github.com/algolia/algoliasearch-client-php) 80 | * [Java: 1.3.5](https://github.com/algolia/algoliasearch-client-java) 81 | * [Android: 1.6.3](https://github.com/algolia/algoliasearch-client-android) 82 | * [Objective-C: 3.4.1](https://github.com/algolia/algoliasearch-client-objc) 83 | * [C-Sharp: 3.1.0](https://github.com/algolia/algoliasearch-client-csharp) 84 | * [Go: 1.2.0](https://github.com/algolia/algoliasearch-client-go) 85 | 86 | 87 | [1]: https://nsone.net 88 | [2]: https://www.algolia.com/dsn 89 | [3]: ./assets/nsone-dig-latency.png 90 | [4]: https://threatpost.com/ultradns-dealing-with-ddos-attack/105806 91 | [5]: https://twitter.com/hashtag/hugops 92 | [6]: http://www.zdnet.com/article/ddos-attack-on-ultradns-affects-amazon-com-salesforce-com-petco-com/ 93 | [7]: http://en.wikipedia.org/wiki/Top-level_domain 94 | [8]: ./assets/route53-dig-latency.png 95 | -------------------------------------------------------------------------------- /_posts/2015-05-28-we-just-raised-our-series-a-whats-next.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: We just raised our Series A. What's next? 4 | author: Nicolas 5 | --- 6 | 7 | You may have heard last week in the [press](https://www.algolia.com/press), 8 | Algolia has just raised an $18.3M Series A round of financing led by Accel 9 | Partners! Philippe Botteri from Accel is joining our board and we can't wait 10 | to benefit from his experience! We are also excited to welcome Lead Edge 11 | Capital and to have received the trust of industry pioneers such as Ilya 12 | Sukhar of Parse, Solomon Hykes of Docker, Erik Swan of Splunk, and Kevin Rose 13 | of Digg. 14 | 15 | This funding represents a major milestone for Algolia. Thanks to the 16 | commitment of our customers our growth last year enabled us to demonstrate a 17 | strong product market fit. We are proud to count many of you as our customers 18 | who have seen in our offer a way to deliver a better search experience, 19 | improving their end-users' engagement. 20 | 21 | We want to change the way people interact with information. We don't want 22 | people to "search" in the traditional type-keyword/hit-enter/wait-for-results 23 | /repeat-until-found-or-abandon way; we want them to intuitively access data. 24 | We strongly believe that search should become a frontend and UX priority. 25 | That's why we focus so much on the two must-haves for building a seamless and 26 | interactive experience: speed which enables updating results as-you-type, and 27 | relevance which ensures that results are good even after only a couple of 28 | keystrokes. 29 | 30 | It's time for us to accelerate on that vision. With the help of this new 31 | funding, we are going to continue investing in our core product, and in making 32 | it available to an ever-expanding community with many new integrations. Search 33 | is everywhere and you can count on us to come up with new creative ways to 34 | delight your users with an outstanding experience. Stay tuned! 35 | 36 | We will also double down on customer success, which has been so important to 37 | our growth. Please make us accountable and let us know if there is anything we 38 | can improve. 39 | 40 | We have embarked on a journey to change the face of user-facing search, 41 | everywhere. Join us, it's going to be fun! 42 | 43 | PS: We're [hiring](https://www.algolia.com/jobs)! 44 | 45 | -------------------------------------------------------------------------------- /_posts/2015-07-15-new-distributed-search-network-texas.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: Welcome Texas! 4 | author: Gaetan 5 | --- 6 | 7 |

8 | You probably already know it: any millisecond that end-users have to wait to 9 | get their results drives us nuts. But what on Earth does this have to do with 10 | Texas? Actually a lot! 11 |

12 | 13 | ## You want your search to be instant? Let's talk network... 14 | 15 | When looking at the speed of search on a website or a mobile application, the 16 | performance of the search engine is just one part of the equation. When you're 17 | using an extremely fast engine, network latency and saturated links quickly 18 | become your biggest enemies: it simply takes time for the user query to reach 19 | the engine and for the results to get back to the user's browser. 20 | 21 | In some cases, the round trip can easily take more than a second. In the US, it 22 | can take up to 300ms to simply establish an SSL connection between the two 23 | coasts. All this also applies to the communications between your backend and 24 | the servers that host your search engine. The network can simply ruin the real 25 | time experience you hoped to offer with your search engine. 26 | 27 | ## A new US Central point of presence to reach a 25ms total delivery time across the US 28 | 29 | A great search experience is to drive end-users towards what they're looking 30 | as quickly and seamlessly as possible. For us at Algolia it means to be able 31 | to dynamically update the content displayed as the end-user is typing a query. 32 | Being able to offer this find as-you-type experience obviously requires a very 33 | performant search engine but it also requires to host the search engine itself 34 | as close as possible to the end-user in order to tackle the network latency. 35 | 36 | This is why we are adding this new US Central region to our existing twelve 37 | regions. With the addition of the Dallas PoP, Algolia's API is now accessible 38 | from thirteen different regions including US (East, West and Central), 39 | Australia, Brazil, Canada, France, Germany, Hong Kong, India, Japan, Russia, 40 | and Singapore. 41 | 42 | If your audience is spread out across multiple regions, you can use Algolia 43 | from a combination of these regions to ensure minimal results delivery time 44 | and optimal speed for all your users (Algolia's Distributed Search Network 45 | automatically routes user queries to your closest region). 46 | 47 | This new US Central PoP, combined with Algolia's US East and US West PoPs, now 48 | allows to deliver search results across the US with less than 25 milliseconds of 49 | latency. This guarantees a seamless find-as-you-type experience on websites and 50 | mobile applications all across the US. 51 | 52 | [![dallas2][1]](https://blog.algolia.com/wp-content/uploads/2015/07/dallas2.jpg) 53 | 54 | ## Getting closer to additional infrastructure providers 55 | 56 | When you choose SaaS providers, especially when their service becomes a core 57 | component of your product, you probably prefer the ones hosted close to where 58 | you operate your backend, for latency and availability reasons. This is 59 | actually why we initially started in the US by opening PoPs in Ashburn (VA) 60 | and San Jose (CA), close to the AWS PoPs, which most of our customers rely on 61 | today. 62 | 63 | Our new presence in Texas allows services which rely for their backend on 64 | local infrastructure providers such as Rackspace and Softlayer to also benefit 65 | from the full power of Algolia. This new PoP offers them an extremely low 66 | network latency between their backend and our API. 67 | 68 | If you're not already an Algolia user and you want to give it a try, simply 69 | [sign up][2] for a 14 day trial and select 70 | the US Central region in the process. 71 | 72 | If you are already using Algolia and want to migrate to the US Central region, 73 | simply drop us a line at [support@algolia.com][3] or 74 | on the live chat. 75 | 76 | If you're none of the two above, we still think you're awesome! 77 | 78 | Cheers! 79 | 80 | 81 | [1]: ./assets/dallas2.jpg 82 | [2]: https://www.algolia.com/users/sign_up 83 | [3]: mailto:support@algolia.com 84 | -------------------------------------------------------------------------------- /_posts/2017-12-20-welcome-to-jekyll.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Welcome to Jekyll!" 4 | date: 2017-12-20 11:12:41 +0100 5 | categories: jekyll update 6 | --- 7 | You’ll find this post in your `_posts` directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run `jekyll serve`, which launches a web server and auto-regenerates your site when a file is updated. 8 | 9 | To add new posts, simply add a file in the `_posts` directory that follows the convention `YYYY-MM-DD-name-of-post.ext` and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works. 10 | 11 | Jekyll also offers powerful support for code snippets: 12 | 13 | {% highlight ruby %} 14 | def print_hi(name) 15 | puts "Hi, #{name}" 16 | end 17 | print_hi('Tom') 18 | #=> prints 'Hi, Tom' to STDOUT. 19 | {% endhighlight %} 20 | 21 | Check out the [Jekyll docs][jekyll-docs] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll’s GitHub repo][jekyll-gh]. If you have questions, you can ask them on [Jekyll Talk][jekyll-talk]. 22 | 23 | [jekyll-docs]: https://jekyllrb.com/docs/home 24 | [jekyll-gh]: https://github.com/jekyll/jekyll 25 | [jekyll-talk]: https://talk.jekyllrb.com/ 26 | -------------------------------------------------------------------------------- /about.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: page 3 | title: About 4 | permalink: /about/ 5 | --- 6 | 7 |

8 | This is an example of how you can integrate the 9 | 10 | jekyll-algolia 11 | plugin into your Jekyll theme. 12 |

13 | 14 |

15 | Check out the 16 | source 17 | or 18 | the tutorial 19 | for more information. 20 |

21 | 22 | -------------------------------------------------------------------------------- /assets/2015-04-27-161853_1266x829_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-161853_1266x829_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-162229_1258x982_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-162229_1258x982_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-170339_976x845_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-170339_976x845_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-170757_1288x486_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-170757_1288x486_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-171034_1296x385_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-171034_1296x385_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-172249_1248x868_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-172249_1248x868_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-27-174139_920x306_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-27-174139_920x306_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-28-224616_1126x129_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-28-224616_1126x129_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-28-225743_1629x497_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-28-225743_1629x497_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-28-232019_1153x526_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-28-232019_1153x526_scrot.png -------------------------------------------------------------------------------- /assets/2015-04-28-232444_1275x569_scrot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/2015-04-28-232444_1275x569_scrot.png -------------------------------------------------------------------------------- /assets/Capture-decran-2014-01-17-18.22.23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Capture-decran-2014-01-17-18.22.23.png -------------------------------------------------------------------------------- /assets/Capture-decran-2014-01-24-01.26.08-600x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Capture-decran-2014-01-24-01.26.08-600x150.png -------------------------------------------------------------------------------- /assets/Capture-decran-2014-07-11-17.31.04-1024x486.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Capture-decran-2014-07-11-17.31.04-1024x486.png -------------------------------------------------------------------------------- /assets/ChromeWebStore_BadgeWBorder_v2_206x58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/ChromeWebStore_BadgeWBorder_v2_206x58.png -------------------------------------------------------------------------------- /assets/CitiesSuggestIOSPortraitSmall-155x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/CitiesSuggestIOSPortraitSmall-155x300.png -------------------------------------------------------------------------------- /assets/CitiesSuggestIPhone5Slide3-300x194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/CitiesSuggestIPhone5Slide3-300x194.png -------------------------------------------------------------------------------- /assets/DSN-b3ce122c790c492c2f2c8ddbabaae464.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/DSN-b3ce122c790c492c2f2c8ddbabaae464.jpg -------------------------------------------------------------------------------- /assets/Divided screen hipchat algolia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Divided screen hipchat algolia.png -------------------------------------------------------------------------------- /assets/Divided%20screen%20hipchat%20algolia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Divided%20screen%20hipchat%20algolia.png -------------------------------------------------------------------------------- /assets/Emergency-exit-prev.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Emergency-exit-prev.jpg -------------------------------------------------------------------------------- /assets/NextBerlin-300x155.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/NextBerlin-300x155.png -------------------------------------------------------------------------------- /assets/Omar-Kassim-Founder-of-JadoPado-Image-2-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Omar-Kassim-Founder-of-JadoPado-Image-2-1.jpg -------------------------------------------------------------------------------- /assets/Screen-Shot-2013-12-23-at-11.38.19-263x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2013-12-23-at-11.38.19-263x300.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2013-12-23-at-11.40.09-263x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2013-12-23-at-11.40.09-263x300.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2013-12-23-at-11.42.01-262x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2013-12-23-at-11.42.01-262x300.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2013-12-23-at-11.47.52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2013-12-23-at-11.47.52.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2014-03-13-at-17.51.50-300x199.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2014-03-13-at-17.51.50-300x199.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2014-08-14-at-16.37.25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2014-08-14-at-16.37.25.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2014-08-14-at-16.38.34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2014-08-14-at-16.38.34.png -------------------------------------------------------------------------------- /assets/Screen-Shot-2015-04-13-at-18.06.28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Screen-Shot-2015-04-13-at-18.06.28.png -------------------------------------------------------------------------------- /assets/ScreenshotTwitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/ScreenshotTwitter.png -------------------------------------------------------------------------------- /assets/Sharypic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Sharypic.png -------------------------------------------------------------------------------- /assets/SmartContact-iphone5-489x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/SmartContact-iphone5-489x1024.png -------------------------------------------------------------------------------- /assets/StartInParis-1024x768.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/StartInParis-1024x768.jpg -------------------------------------------------------------------------------- /assets/StartInParis.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/StartInParis.gif -------------------------------------------------------------------------------- /assets/Stopwatch-lowres-300x225.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Stopwatch-lowres-300x225.jpg -------------------------------------------------------------------------------- /assets/Top categories.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Top categories.png -------------------------------------------------------------------------------- /assets/Top-search-1024x409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Top-search-1024x409.png -------------------------------------------------------------------------------- /assets/Trend Louboutin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/Trend Louboutin.png -------------------------------------------------------------------------------- /assets/airpair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/airpair.png -------------------------------------------------------------------------------- /assets/amazon-search-20011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/amazon-search-20011.png -------------------------------------------------------------------------------- /assets/amazon-search-today-e1417016290894.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/amazon-search-today-e1417016290894.png -------------------------------------------------------------------------------- /assets/appstore.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/appstore.jpg -------------------------------------------------------------------------------- /assets/appsworld-300x224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/appsworld-300x224.jpg -------------------------------------------------------------------------------- /assets/available-on-iphone-app-store-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/available-on-iphone-app-store-logo.png -------------------------------------------------------------------------------- /assets/blackberry-300x224.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/blackberry-300x224.jpg -------------------------------------------------------------------------------- /assets/citiessuggest-leweb-180x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/citiessuggest-leweb-180x300.png -------------------------------------------------------------------------------- /assets/dallas2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/dallas2.jpg -------------------------------------------------------------------------------- /assets/dontmakemethink.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/dontmakemethink.jpeg -------------------------------------------------------------------------------- /assets/dsn-shot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/dsn-shot.jpg -------------------------------------------------------------------------------- /assets/eoin-o-driscoll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/eoin-o-driscoll.png -------------------------------------------------------------------------------- /assets/fanfootage.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/fanfootage.gif -------------------------------------------------------------------------------- /assets/growthacker.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/growthacker.jpg -------------------------------------------------------------------------------- /assets/guy4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/guy4.jpg -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen Shot 2015-01-10 at 17.22.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen Shot 2015-01-10 at 17.22.06.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen%20Shot%202015-01-10%20at%2017.22.06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420906940736_Screen%20Shot%202015-01-10%20at%2017.22.06.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen Shot 2015-01-10 at 17.23.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen Shot 2015-01-10 at 17.23.21.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen%20Shot%202015-01-10%20at%2017.23.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907058703_Screen%20Shot%202015-01-10%20at%2017.23.21.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen Shot 2015-01-10 at 17.24.51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen Shot 2015-01-10 at 17.24.51.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen%20Shot%202015-01-10%20at%2017.24.51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907103965_Screen%20Shot%202015-01-10%20at%2017.24.51.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen Shot 2015-01-10 at 17.32.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen Shot 2015-01-10 at 17.32.21.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen%20Shot%202015-01-10%20at%2017.32.21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907561110_Screen%20Shot%202015-01-10%20at%2017.32.21.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen Shot 2015-01-10 at 17.35.07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen Shot 2015-01-10 at 17.35.07.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen%20Shot%202015-01-10%20at%2017.35.07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907721098_Screen%20Shot%202015-01-10%20at%2017.35.07.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen Shot 2015-01-10 at 17.38.44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen Shot 2015-01-10 at 17.38.44.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen%20Shot%202015-01-10%20at%2017.38.44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420907937295_Screen%20Shot%202015-01-10%20at%2017.38.44.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen Shot 2015-01-10 at 17.45.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen Shot 2015-01-10 at 17.45.01.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen%20Shot%202015-01-10%20at%2017.45.01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420908337814_Screen%20Shot%202015-01-10%20at%2017.45.01.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen Shot 2015-01-10 at 18.00.12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen Shot 2015-01-10 at 18.00.12.png -------------------------------------------------------------------------------- /assets/hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen%20Shot%202015-01-10%20at%2018.00.12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_JoORx6jqcVU_p.233467_1420909252393_Screen%20Shot%202015-01-10%20at%2018.00.12.png -------------------------------------------------------------------------------- /assets/hackpad.com_Y3thzadEtdY_p.233467_1419338581444_capture.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_Y3thzadEtdY_p.233467_1419338581444_capture.gif -------------------------------------------------------------------------------- /assets/hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen Shot 2014-12-23 at 13.46.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen Shot 2014-12-23 at 13.46.04.png -------------------------------------------------------------------------------- /assets/hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen%20Shot%202014-12-23%20at%2013.46.04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_Y3thzadEtdY_p.233467_1419338775543_Screen%20Shot%202014-12-23%20at%2013.46.04.png -------------------------------------------------------------------------------- /assets/hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen Shot 2014-12-23 at 13.45.54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen Shot 2014-12-23 at 13.45.54.png -------------------------------------------------------------------------------- /assets/hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen%20Shot%202014-12-23%20at%2013.45.54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hackpad.com_Y3thzadEtdY_p.233467_1419338826276_Screen%20Shot%202014-12-23%20at%2013.45.54.png -------------------------------------------------------------------------------- /assets/hand-203x300.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/hand-203x300.jpg -------------------------------------------------------------------------------- /assets/jadopado.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/jadopado.gif -------------------------------------------------------------------------------- /assets/leanstack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/leanstack.jpg -------------------------------------------------------------------------------- /assets/nsone-dig-latency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/nsone-dig-latency.png -------------------------------------------------------------------------------- /assets/objC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/objC.png -------------------------------------------------------------------------------- /assets/recommendations.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/recommendations.gif -------------------------------------------------------------------------------- /assets/route53-dig-latency.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/route53-dig-latency.png -------------------------------------------------------------------------------- /assets/rubymotion1-270x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/rubymotion1-270x300.png -------------------------------------------------------------------------------- /assets/sadnessofsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/sadnessofsearch.png -------------------------------------------------------------------------------- /assets/search.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/search.gif -------------------------------------------------------------------------------- /assets/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/search.png -------------------------------------------------------------------------------- /assets/searchForEvernoteSmall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/searchForEvernoteSmall.png -------------------------------------------------------------------------------- /assets/searchquadrant1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/searchquadrant1.gif -------------------------------------------------------------------------------- /assets/seedcamp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/seedcamp.png -------------------------------------------------------------------------------- /assets/shot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/shot.jpg -------------------------------------------------------------------------------- /assets/slowerthanaverage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/slowerthanaverage.png -------------------------------------------------------------------------------- /assets/teddy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/teddy.png -------------------------------------------------------------------------------- /assets/user-experience.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/user-experience.jpg -------------------------------------------------------------------------------- /assets/vinny.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/vinny.png -------------------------------------------------------------------------------- /assets/wwdc1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/wwdc1.jpg -------------------------------------------------------------------------------- /assets/wwdc2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/algolia/jekyll-algolia-example/c9a55a750665e191b9075d6183f2948c74f67e05/assets/wwdc2.jpg -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | # You don't need to edit this file, it's empty on purpose. 3 | # Edit theme's home layout instead if you wanna make some changes 4 | # See: https://jekyllrb.com/docs/themes/#overriding-theme-defaults 5 | layout: home 6 | --- 7 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "_site" 3 | command = "jekyll build && jekyll algolia" 4 | --------------------------------------------------------------------------------