<!DOCTYPE html>

<html lang="en-US" prefix="og: http://ogp.me/ns#" ng-app="hortonWorksApp"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><style type="text/css">@charset "UTF-8";[ng\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>
        
        <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
        <link rel="profile" href="http://gmpg.org/xfn/11">
        <title>Releases</title>

        <style type="text/css">
            img.wp-smiley,
            img.emoji {
                display: inline !important;
                border: none !important;
                box-shadow: none !important;
                height: 1em !important;
                width: 1em !important;
                margin: 0 .07em !important;
                vertical-align: -0.1em !important;
                background: none !important;
                padding: 0 !important;
            }
        </style>

    <script>
        (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
                    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
                m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
        })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

        ga('create', 'UA-78972211-1', 'auto');
        ga('send', 'pageview');

    </script>

    <link rel="stylesheet" id="default-css" href="/css/default.css" type="text/css" media="all">
    <link rel="stylesheet" id="legacy-css" href="/css/legacy.css" type="text/css" media="all">
    <link rel="stylesheet" id="gravityforms-css" href="/css/gravityforms.css" type="text/css" media="all">
    <link rel="stylesheet" id="selectboxit-css" href="/css/selectBoxIt.css" type="text/css" media="all">
    <link href='http://fonts.googleapis.com/css?family=Roboto%20Condensed' rel='stylesheet' type='text/css'>

    <script type="text/javascript" src="/js/jquery.js"></script>
    <script type="text/javascript" src="/js/jquery-migrate.min.js"></script>
    <script type="text/javascript" src="/js/jquery.mobile.custom.min.js"></script>
    <script type="text/javascript" src="/js/isotope.pkgd.min.js"></script>
    <script type="text/javascript" src="/js/navigation.js"></script>
    <script type="text/javascript" src="/js/slider.js"></script>
    <script type="text/javascript" src="/js/jquery.classyloader.js"></script>
    <script type="text/javascript" src="/js/hero-slider.js"></script>
    <script type="text/javascript" src="/js/footer.js"></script>
    <script type="text/javascript" src="/js/top-form.js"></script>
    <script type="text/javascript" src="/js/local6.js"></script>
    <script type="text/javascript" src="/js/select-list.js"></script>
    <script type="text/javascript" src="/js/legacy.js"></script>
    <script type="text/javascript" src="/js/paralax-scroll.js"></script>
    <script type="text/javascript" src="/js/jquery-ui.min.js"></script>
    <script type="text/javascript" src="/js/jquery.selectBoxIt.min.js"></script>
    <script type="text/javascript" src="/js/scroll-slider.js"></script>
    <script type="text/javascript" src="/js/charts-animate.js"></script>
    <script type="text/javascript" src="/js/dotdotdot.js"></script>
    <script type="text/javascript" src="/js/products_scroll.js"></script>
    <script type="text/javascript" src="/js/parallax.min.js"></script>
    <script type="text/javascript" src="/js/parallax.js"></script>
    <script type="text/javascript" src="/js/shb0wjr.js"></script>

    <script>
    window.lsfDataLayer = window.lsfDataLayer || [];
    </script>
    
    <style>
      body {
        font-family: "roboto-condensed", sans-serif;
      }
    </style>

    <!-- Angular js files -->
    <script src="/js/angular.min.js"></script>
    <script src="/js/angular-animate.min.js"></script>
    <script src="/js/app.js"></script>
    <script src="/js/pressReleaseController.js"></script>
    <script src="/js/eventCtrl.js"></script>
    <!-- End Angular js files -->
    <link rel="stylesheet" type="text/css" href="/css/prettify.css">
    <script type="text/javascript" async="" src="/js/munchkin-beta.js"></script>
    <link type="text/css" href="/css/jquery-ui-insightera-custom-1.8.css" rel="stylesheet">
    <style id="style-1-cropbar-clipper">
    /* Copyright 2014 Evernote Corporation. All rights reserved. */
    
    .en-markup-crop-options {
        top: 18px !important;
        left: 50% !important;
        margin-left: -100px !important;
        width: 200px !important;
        border: 2px rgba(255, 255, 255, .38) solid !important;
        border-radius: 4px !important;
    }
    
    .en-markup-crop-options div div:first-of-type {
        margin-left: 0px !important;
    }
    </style>
</head>


<body class="wrap">
  <header>
    <div class="main-navigation" style="height: 85px;">
        <div class="main-nav fixed">
            <div class="wrapper">
                <div class="logo">
                    <a href=""><img src="/img/logo.png" alt="Logo"></a>
                </div>
                <nav>
                    <div class="toggle">
                        <span></span>
                        <span></span>
                        <span></span>
                    </div>
                    <div class="menu-wrapper" style="height: auto; display: block;">
                        <ul class="main-menu">
    <li class="products-menu"><a href="/">Home</a>
    </li>
    <li class="solutions-menu"><a href="/about/">About</a>
    </li>
    <li class="services-menu"><a href="/documentation/">Documentation</a>
    </li>
    <li class="services-menu"><a href="/community/">Community</a>
    </li>
    <li class="training-menu"><a href="/news/">News</a>
    </li>
    <li>
        <button class="button-default button-green" style="line-height:43px;"> <a>Download </a></button>
    </li>
</ul>

                    </div>
                </nav>
            </div>
        </div>
    </div>
</header>


    <section class="news">
    <div class="grid">

      <div class="docs-nav-mobile unit whole show-on-mobiles">
  <select onchange="if (this.value) window.location.href=this.value">
    <option value="">Navigate the blog…</option>
    <option value="/news/">Home</option>
    <optgroup label="v1.x">
      
      <option value="/news/2016/01/08/debo-committer/">Debo Dutta joins PPMC</option>
      
      <option value="/news/2015/12/12/new-logo/">Metron adopts new logo</option>
      
      <option value="/news/2015/12/06/metron-incubator/">Metron accepted into Apache Incubator</option>
      
    </optgroup>
  </select>
</div>


      <div class="unit four-fifths">
        

      </div>

      <div class="unit one-fifth hide-on-mobiles">
  <aside>
    <ul>
      <li class="">
        <a href="/news/">All News</a>
      </li>
      <li class="current">
        <a href="/news/releases/">Metron Releases</a>
      </li>
    </ul>
    <h4>Recent Releases</h4>
    <ul>
      
    </ul>
    <h4>Other News</h4>
    <ul>
        
        
        <li class="">
          <a href="/news/2016/01/08/debo-committer/">Debo Dutta joins PPMC</a>
        </li>
        
        
        
        <li class="">
          <a href="/news/2015/12/12/new-logo/">Metron adopts new logo</a>
        </li>
        
        
        
        <li class="">
          <a href="/news/2015/12/06/metron-incubator/">Metron accepted into Apache Incubator</a>
        </li>
        
        
    </ul>
  </aside>
</div>


      <div class="clear"></div>

    </div>
  </section>


  </section>
<section class="intro-block darken" id="docshome">
    <div class="content-960 hover-btn text-center disclaimer">
        <p>Copyright © 2018, The Apache Software Foundation. Licensed under the <a class="white" href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
        <p>Apache Metron and its logo are trademarks of The Apache Software Foundation.</p>
    </div>
</section>

  <script>
  var anchorForId = function (id) {
    var anchor = document.createElement("a");
    anchor.className = "header-link";
    anchor.href      = "#" + id;
    anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
    anchor.title = "Permalink";
    return anchor;
  };

  var linkifyAnchors = function (level, containingElement) {
    var headers = containingElement.getElementsByTagName("h" + level);
    for (var h = 0; h < headers.length; h++) {
      var header = headers[h];

      if (typeof header.id !== "undefined" && header.id !== "") {
        header.appendChild(anchorForId(header.id));
      }
    }
  };

  document.onreadystatechange = function () {
    if (this.readyState === "complete") {
      var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
      if (!contentBlock) {
        return;
      }
      for (var level = 1; level <= 6; level++) {
        linkifyAnchors(level, contentBlock);
      }
    }
  };
</script>


</body>
</html>
