---
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.7.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>2015 CloudStack Days</h4>

			<p>
			In 2015, five CloudStack Days events will be held across the globe. Each one-day event will feature morning plenary sessions, afternoon breakout sessions in user and developer tracks and a hackathon. Learn more at: 
			</p>

			<p>
				<ul>
					<li>CloudStack Days <a href="http://events.linuxfoundation.org/events/cloudstack-seattle">Seattle 2015</a></li>
					<li>CloudStack Days <a href="http://events.linuxfoundation.org/events/cloudstack-austin">Austin 2015</a></li>
					<li>CloudStack Days <a href="http://events.linuxfoundation.org/events/cloudstack-tokyo">Tokyo 2015</a></li>
					<li>CloudStack Collaboration Conference Europe <a href="http://events.linuxfoundation.org/events/cloudstack-collaboration-conference-europe">Dublin 2015</a></li>
				</ul>
			</p>
			<p>
				View <a href="https://www.youtube.com/playlist?list=PLbzoR-pLrL6ruJrhXZ-jSSYw0m3WfK4ea">videos</a> from the CloudStack Collaboration Conference Europe 2014
			</p>

			<h4>Upcoming CloudStack Related Events</h4>

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