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

Getting Involved
================

Right now the primary audience for Apache Arrow are the developers of data
systems; most people will use Apache Arrow indirectly through systems that use
it for internal data handling and interoperating with other Arrow-enabled
systems.

Even if you do not plan to contribute to Apache Arrow itself or Arrow
integrations in other projects, we'd be happy to have you involved:

 * Join the mailing list: send an email to
   `dev-subscribe@arrow.apache.org <mailto:dev-subscribe@arrow.apache.org>`_.
   Share your ideas and use cases for the project or read through the
   `Archive <http://mail-archives.apache.org/mod_mbox/arrow-dev/>`_.
 * Follow our activity on `JIRA <https://issues.apache.org/jira/browse/ARROW>`_
 * Learn the `Format / Specification
   <https://github.com/apache/arrow/tree/master/format>`_
