---
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 4.8.0 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>
