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

