---
title: Welcome to CloudStack
---

<div class="row">
  <div class="col-lg-12">
    <div class="bs-example">
      <div class="jumbotron">
        <div class="row">
          <div class="col-lg-8">
            <h1>Apache CloudStack&#8482;</h1>
            
            <p>Open Source Cloud Computing&#8482;</p>

          </div>

          <div class="col-lg-4">

            <img src="images/monkey.png" style="width: 210px;" alt="">

          </div>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="row">
  <div class="col-lg-6">
    <div class="panel panel-default">
      <div class="panel-heading">

      Latest Announcement

      <a href="https://blogs.apache.org/cloudstack/feed/entries/atom"><img src="/images/feed-icon-14x14.png" class="pull-right" alt=""></a>

      </div>

      <div id="headline" class="panel-body">
      </div>
    </div>
    <div class="panel panel-default">
      <div class="panel-heading">

        About CloudStack

      </div>

      <div class="panel-body">

<p>
Apache CloudStack is open source software designed to deploy and manage large networks of virtual machines, as a highly available, highly scalable Infrastructure as a Service (IaaS) cloud computing platform. CloudStack is used by a number of service providers to offer public cloud services, and by many companies to provide an on-premises (private) cloud offering, or as part of a hybrid cloud solution.
</p>

<p>
CloudStack is a turnkey solution that includes the entire "stack" of features most organizations want with an IaaS cloud: compute orchestration, Network-as-a-Service, user and account management, a full and open native API, resource accounting, and a first-class User Interface (UI).
</p>

<p>
CloudStack currently supports the most popular hypervisors: VMware, KVM, Citrix XenServer, Xen Cloud Platform (XCP), Oracle VM server and Microsoft Hyper-V.
</p>

<p>
Users can manage their cloud with an easy to use Web interface, command line tools, and/or a full-featured RESTful API. In addition, CloudStack provides an API that's compatible with AWS EC2 and S3 for organizations that wish to deploy hybrid clouds.
</p>

<a href="about.html"><button type="button" class="btn btn-info">Learn More</button></a>

      </div>

    </div>

    <div class="panel panel-default">
      <div class="panel-heading">

Join Us

      </div>

	<div class="panel-body">

	<p>
	Learn more about getting involved with Apache CloudStack on the <a href="contribute.html">Contributing to Apache CloudStack</a> page, or go straight to our <a href="developers.html">Developer Resources</a> page.
	</p>
	</div>

</div>
</div>

<div class="col-lg-6">
	<div class="panel panel-default">
		<div class="panel-heading">
			Get CloudStack
		</div>
		<div class="panel-body">

		<p class="text-warning">Apache CloudStack <%= data.cloudstack.versions.main %> is out!</p>

		<p>
		Looking for other versions of Apache CloudStack? You can find our archives on the download page as well.
		</p>

		<a href="downloads.html"><button type="button" class="btn btn-success">Download Now</button></a>

		</div>

	</div>

	<div class="panel panel-default">
		<div class="panel-heading">
		CloudStack Events
		</div>

		<div class="panel-body" id="events">

			<h4>2016 CloudStack Collaboration Conferences</h4>

			<p>
			In 2016, two Apache <a href="http://cloudstackcollab.org/">CloudStack Collaboration Conferences</a> events will be held in the Americas. Each event will feature morning plenary sessions, afternoon breakout sessions in user and developer tracks and a hackathon. Learn more at: 
			</p>

			<p>
				<ul>
					<li><a href="http://ca.cloudstackcollab.org/">Montreal, Canada, June 1-3, 2016</a></li>
					<li><a href="http://cloudstack.usp.br/">Sao Paulo, Brasil, September 29-30, 2016</a></li>
				</ul>
			</p>
			<p>
				View <a href="https://www.youtube.com/playlist?list=PLGeM09tlguZSeNyOyQKJHNX4pxgK-yoTA">videos</a> from the CloudStack Collaboration Conference Europe 2015 in Dublin.
			</p>

			<h4>Upcoming CloudStack Related Events</h4>

      <ul>
        <li><a href="https://www.eventbrite.co.uk/e/cloudstack-european-user-group-tickets-23036757562">CloudStack European User Group, Berlin, June 16, 2016</a></li>
      </ul>
		</div>

	</div>

	<div class="panel panel-default">
		<div class="panel-heading">
			What are people saying?
		</div>
		<div class="panel-body">

			<a class="twitter-timeline" href="https://twitter.com/search?q=cloudstack" data-widget-id="383337162126544896" data-chrome="nofooter transparent noheader noborders noscrollbar">Tweets about "cloudstack"</a>
			<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>

		</div>

	</div>

</div>

</div>

<script>
var maxEntries = 3; // if 0 then there will be no limit

function slug(str){
 return str.replace(/\s/g,'-').replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase();
}
/**
 * This function appends rss feed items to divs with the same slug
 * Name is the title of the feed, when slugged i use it as a div id
 * File is the rss feed
 */
function newFeed(id, file) {
 $.getJSON("//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%22"+encodeURIComponent(file)+"%22&format=json&callback=?", function(d) {
  var count = 0;
  $(d.query.results.feed.entry).each(function() {
    if(maxEntries == 0 || maxEntries>count){
     var title = this.title.content;
     var content = this.content.content;
     var pubDate = new Date(this.published);
     // Format however you want, I only went for link and title
     var anItem = "<h4>"+title+"</h4><p>"+pubDate+"</p>"+content+"<hr />";
     $("#"+id).append(anItem);
     if (count==0)
      $("#headline").append("<p>"+title+"<br/><a href='#news'>Read more here.</a></p>");
     count++;
    }
   });
 });
};
</script>

<p><a name='news'></a><br /> </p><p> </p>

<div class="panel panel-default">
	<div class="panel-heading">
		Project Announcements
	</div>
	<div class="panel-body">
		<div id="feed">
		</div>

	</div>

</div>

<script>
newFeed("feed", "https://blogs.apache.org/cloudstack/feed/entries/atom");
</script>

<script>
var maxEvents = 3; // if 0 then there will be no limit

/**
 * This function appends rss feed items to divs with the same slug
 * Name is the title of the feed, when slugged i use it as a div id
 * File is the rss feed
 */
function newEventList(id, file) {
 $.getJSON("//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%22"+encodeURIComponent(file)+"%22&format=json&callback=?", function(d) {
  var count = 0;
  $(d.query.results.feed.entry).each(function() {
    if(maxEvents == 0 || maxEvents>count){
     var title = this.title;
     var link = this.link.href;
     var anItem = "<p><a href='"+link+"' target='_blank'>"+title+"</a></p>";
     $("#"+id).append(anItem);
     count++;
    }
   });
   $("#events").append("<p><small>For more events, take a look at the <a href='http://lanyrd.com/topics/apache-cloudstack/' target='_blank'>Apache CloudStack topic page</a> on Lanyrd.</small></p>");
 });
};

newEventList("events", "http://lanyrd.com/topics/apache-cloudstack/feed/");

</script>
