////
     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.
////
= Participating in Apache NetBeans
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: Participate in Apache NetBeans 
:description: Participate in Apache NetBeans 
:toc: left
:toclevels: 4
:toc-title: 

The Apache Software Foundation has set up link:http://community.apache.org/[a
specific website] designed to help newcomers take their first steps toward
being part of our Community. 

You can participate in the Apache NetBeans Project in many different ways.
Here are some ideas:

== Contributing code

You may want to fix issues or provide a new functionality that is your personal work to Apache NetBeans project. 
You will need to follow the link:submit-pr.html#contributing-code[contributing code] procedure to learn how to contribute code to the Apache NetBeans project.

If your contribution code is owned or developped in another organization outside Apache. Your organization may want to *donate* this contribution to Apache NetBeans project.
You will need to follow this link:submit-pr.html#donating-code[donating code] procedure.

== Reporting issues

See link:report-issue.html[reporting issues] for instructions on how to report an issue.

== Join the NetCAT program
The NetBeans Community Acceptance Testing program (link:netcat.html[NetCAT]) has helped stabilize development
builds for years.

[[documentation]]
== Improving the documentation

We will be porting existing NetBeans documentation soon. Consider joining the
link:/community/mailing-lists.html[dev mailing list] for updates on how to help with this task.

[[asf]]
== Contributing to the ASF

You may also want to consider link:https://www.apache.org/foundation/contributing.html[donating to the
Apache Software Foundation], joining the link:https://www.apache.org/foundation/sponsorship.html[ASF
Sponsorship Program], or link:https://www.apache.org/foundation/buy_stuff.html[buying ASF merchandise].

