Apache Atlas is a Top Level Project (TLP) at the Apache Software
Foundation (ASF).

This product includes software developed at The Apache Software
Foundation (http://www.apache.org/).

http://atlas.apache.org
