////
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
     distributed with this work for additional information
     regarding copyright ownership.  The ASF licenses this file
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     KIND, either express or implied.  See the License for the
     specific language governing permissions and limitations
     under the License.
////
= About Apache NetBeans
:jbake-type: page
:jbake-tags: about
:jbake-status: published
:keywords: Apache NetBeans About
:description: About Apache NetBeans
:toc: left
:toc-title:
:icons: font

== Welcome to Apache NetBeans

In June 2000, NetBeans was made open source by Sun Microsystems, which remained
the project sponsor until January 2010 when Sun Microsystems became a
subsidiary of Oracle. 

Throughout its history in Sun Microsystems and Oracle, NetBeans has been free
and open source and has been leveraged by its sponsor as a mechanism for
driving the Java ecosystem forward. 

In 2016, Oracle donated the NetBeans source code to the link:https://www.apache.org/[Apache Software Foundation]. 
In April 2019 Apache NetBeans became a top level Apache project.  Please see
our link:history.html[History section] for more information.

== About Apache NetBeans

Apache NetBeans is top level Apache Project dedicated to providing rock solid
software development products (the Apache NetBeans IDE and the Apache NetBeans
Platform) that address the needs of developers, users and the businesses who
rely on NetBeans as a basis for their products; particularly, to enable them to
develop these products quickly, efficiently and easily by leveraging the
strengths of the Java platform and other relevant industry standards.

The two base products, the Apache NetBeans IDE and Apache NetBeans Platform,
are free for commercial and non-commercial use, under the link:https://www.apache.org/licenses/[Apache license]. 
The source code to both is available to anyone to reuse as they see fit, within the terms of use. 

The Apache NetBeans project is also a vibrant community in which people from across
the globe can ask questions, give advice, contribute and ultimately share in
the success of our products. On the link:/community/mailing-lists.html[NetBeans mailing lists] and forums, you will
find posts from students, developers from top companies, and individuals
looking to expand their skills.

=== The Apache NetBeans IDE

With over 18 million downloads of the NetBeans IDE to date, and over 800,000
participating developers, the NetBeans project is thriving and continues to
grow, thanks to the individuals and partner companies. To be a part of the
community, simply register for free.

Most developers recognize the NetBeans IDE as the original free Java IDE. It is
that, and much more! The Apache NetBeans IDE provides support for several languages
(Java, PHP, JavaFX, JavaScript, etc.) and frameworks, and more (C/C++) will be
incorporated soon.

=== The Apache NetBeans Platform

The Apache NetBeans Platform is a generic framework for Swing applications. It
provides the "plumbing" that, before, every developer had to write
themselves—saving state, connecting actions to menu items, toolbar items and
keyboard shortcuts; window management, and so on.

[.feature]
--
image::gephi-metrics-small.png[role="left", link="gephi-metrics.png"]
---

The NetBeans Platform provides all of these out of the box. You don't need to
manually code these or other basic features, yourself, anymore. See what some
NetBeans-based applications look like. The platform does not add a lot of
overhead to your application — but it can save a huge amount of time and work.

The Apache NetBeans Platform provides a reliable and flexible application
architecture. Your application does not have to look anything like an IDE. It
can save you years of development time. The NetBeans Platform gives you a
time-tested architecture for free. An architecture that encourages sustainable
development practices. Because the NetBeans Platform architecture is modular,
it's easy to create applications that are robust and extensible. 


