////
     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.
////
= Welcome to Apache NetBeans
:jbake-type: page-front
:jbake-tags: main
:jbake-status: published
:keywords: Apache NetBeans
:icons: font
:description: Apache NetBeans
:note: The 'hero' tags below enable the 'hero' area in the page.gsp template
:hero.top: Version 11.1
:hero.title: Apache NetBeans
:hero.subtitle: Fits the Pieces Together

// See https://fontawesome.com/icons?d=gallery for more icons (not all of those are available, though)

[.cards]
****

// Add cards as you see fit below. Try not to repeat consecutive colors.

[.card.blue]
.icon:edit[] Fast & Smart Editing
Apache NetBeans is much more than a text editor. It highlights source code link:/kb/docs/java/editor-codereference.html[syntactically and semantically], lets you easily link:/kb/docs/java/editor-inspect-transform.html[refactor code], with a range of handy and powerful tools.

[.card.green]
.icon:wrench[] Java, JavaScript, PHP, HTML5, CSS, and More
Apache NetBeans provides editors, wizards, and templates to help you create applications in link:/kb/docs/java/index.html[Java], link:/kb/docs/php/index.html[PHP] and many other languages.

[.card.magenta]
.icon:download[] Cross Platform
Apache NetBeans can be link:/download/index.html[installed] on all operating systems that support Java, i.e, Windows, Linux, Mac OSX and BSD. Write Once, Run Anywhere, applies to NetBeans too. 

[.card.green]
.icon:users[] Join us
Subscribe to our link:/community/mailing-lists.html[mailing lists], or follow us in link:https://twitter.com/netbeans[Twitter], link:https://tinyurl.com/netbeans-slack-signup/[Slack], link:https://www.facebook.com/NetBeans[FaceBook] or link:https://www.youtube.com/user/netbeansvideos[YouTube].

[.card.magenta]
.icon:arrow-right[] Participate
See how you can participate by link:/participate/submit-pr.html[submitting pull requests], or link:https://issues.apache.org/jira/projects/NETBEANS/summary[filing issues].

[.card.blue]
.icon:book[] Learn
We are currently reviewing the tutorials. See how you can link:http://netbeans.apache.org/kb/docs/contributing.html[help us] review the link:http://netbeans.apache.org/kb/docs/java/[Java] and link:http://netbeans.apache.org/kb/docs/php/[PHP] tutorials.


****


