////
     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.
////
= Mailing Lists
:jbake-type: page
:jbake-tags: community
:jbake-status: published
:keywords: Apache NetBeans Mailing Lists
:description: Apache NetBeans Mailing Lists
:toc: left
:toc-title: 

[[mailing-lists]]
Mailing lists are the main way to get in touch with the NetBeans Community. Feel free to subscribe and participate. 

Lists are managed with link:https://untroubled.org/ezmlm/[ezmlm], refer to link:https://untroubled.org/ezmlm/manual/[ezmlm manual] for useful help commands.

The mailing lists can also be subscribed to in *digest form*, so that you at most receive one e-mail per day. *Digest form* email addresses are the same as
the email addresses below, substituting `subscribe@` with `digest-subscribe@` and substituting `unsubscribe@` with `digest-unsubscribe@`.


[[users]]
== Users list

Use this list to ask questions about the usage of the NetBeans IDE, whether
for Java, JavaScript, C/C++, or any other language or technology, whether as user of NetBeans IDE or developer on top of the NetBeans Platform.

This list is also useful as well for those using the NetBeans APIs to develop modules and applications.

Using prefix tags in the subject line, such as [ java ] or [ javascript ] is encouraged, to clearly distinguish the topic you're addressing in your e-mail.

- Mailing list address: link:mailto:users@netbeans.apache.org[users@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:users-subscribe@netbeans.apache.org[users-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:users-unsubscribe@netbeans.apache.org[users-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-users/[See the Apache mailing list archive]
- +++ <a href="https://lists.apache.org/list.html?users@netbeans.apache.org">Pony mail archive</a> +++

[[dev]]
== Dev list

Specifically for those committed to working on the development of Apache
NetBeans itself, as well as those committed to promoting and documenting it,
via events and tutorials, etc.

- Mailing list address: link:mailto:dev@netbeans.apache.org[dev@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:dev-subscribe@netbeans.apache.org[dev-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:dev-unsubscribe@netbeans.apache.org[dev-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-dev/[See the Apache mailing list archive]
- +++ <a href="https://lists.apache.org/list.html?dev@netbeans.apache.org">Pony mail archive</a> +++

[[netcat]]
== NetCAT list

Specifically for those involved in the NetBeans Community Acceptance Testing (NetCAT) program.

- Mailing list address: link:mailto:netcat@netbeans.apache.org[netcat@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:netcat-subscribe@netbeans.apache.org[netcat-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:netcat-unsubscribe@netbeans.apache.org[netcat-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-netcat/[See the Apache mailing list archive]
- +++ <a href="https://lists.apache.org/list.html?netcat@netbeans.apache.org">Pony mail archive</a> +++

[[announce]]
== Announce list

Receive announcements only, e.g., when a new release is made available, i.e.,
for those who do not want to get much traffic though want to keep up with the
high level developments of Apache NetBeans. No one other than administrators
are able to write to this mailing list.

- Mailing list address: link:mailto:announce@netbeans.apache.org[announce@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:announce-subscribe@netbeans.apache.org[announce-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:announce-unsubscribe@netbeans.apache.org[announce-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-announce/[See the Apache mailing list archive]

[[commits]]
== Commits list

Receive GitHub commit messages whenever a commit is done.

- Mailing list address: link:mailto:commits@netbeans.apache.org[commits@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:commits-subscribe@netbeans.apache.org[commits-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:commits-unsubscribe@netbeans.apache.org[commits-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-commits/[See the Apache mailing list archive]
- +++ <a href="https://lists.apache.org/list.html?commits@netbeans.apache.org">Pony mail archive</a> +++

[[notifications]]
== Notifications list

Receive GitHub notifications whenever someone adds a comment to an issue and whenever a new pull request is opened or closed.

- Mailing list address: link:mailto:notifications@netbeans.apache.org[notifications@netbeans.apache.org]
- To subscribe please send an email to: link:mailto:notifications-subscribe@netbeans.apache.org[notifications-subscribe@netbeans.apache.org]
- To unsubscribe please send an email to: link:mailto:notifications-unsubscribe@netbeans.apache.org[notifications-unsubscribe@netbeans.apache.org]
- link:http://mail-archives.apache.org/mod_mbox/netbeans-notifications/[See the Apache mailing list archive]
- +++ <a href="https://lists.apache.org/list.html?notifications@netbeans.apache.org">Pony mail archive</a> +++

== Other channels

- You can follow us in link:https://www.facebook.com/NetBeans[Facebook] and link:https://twitter.com/netbeans[Twitter].
- We also have a link:https://www.youtube.com/user/netbeansvideos[YouTube] channel.
- Meet other users in the unofficial link:https://tinyurl.com/netbeans-slack-signup[NetBeans Slack channel]
- There is also a NetBeans IRC channel (#netbeans) on link:https://freenode.net/[freenode].
- Finally we use link:https://github.com/apache/netbeans[GitHub] as a source repository and link:https://issues.apache.org/jira/projects/NETBEANS/summary[JIRA] for issue reporting.

