<commit_before>![Logo](https://s3-eu-west-1.amazonaws.com/org.paraio/para.png)

## A general-purpose backend framework for the cloud.

[![Build Status](https://travis-ci.org/Erudika/para.svg?branch=master)](https://travis-ci.org/Erudika/para)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.erudika/para-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.erudika/para-core)
[![Join the chat at https://gitter.im/Erudika/para](https://badges.gitter.im/Erudika/para.svg)](https://gitter.im/Erudika/para?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)


**Para** was designed as a simple and modular backend framework for object persistence and retrieval.
It helps you build applications faster by taking care of the backend. It works on three levels -
objects are stored in a NoSQL data store or any old relational database, then automatically indexed
by a search engine and finally, cached.

The name "pára" means "steam" in Bulgarian. And just like steam is used to power stuff, you can use
Para to power your mobile or web application backend.

**Para** can be used as a direct dependency to your JVM-based application or as a standalone API server with
multiple applications and clients connecting to it.

See how **Para** [compares to other open source backend frameworks](https://erudika.com/blog/2015/10/21/backend-frameworks-usergrid-loopback-para-baasbox-deployd-telepat/).

### Features

- RESTful JSON API secured with Amazon's Signature 4 algorithm
- Database-agnostic, designed for scalable data stores (DynamoDB, Cassandra, MongoDB, etc.)
- Full-text search (Elasticsearch by default)
- Distributed object cache (Hazelcast by default)
- Multi-tenancy support - each app has its own table, index and cache
- IoT support and integration with AWS and Azure
- Flexible security based on Spring Security (Social login, JWT support, CSRF protection, etc.)
- Simple but effective resource permissions for client access control
- Robust constraint validation mechanism based on JSR-303 and Hibernate Validator
- Per-object control of persistence, index and cache operations
- Modular design powered by Google Guice and support for plugins
- I18n utilities for translating language packs and working with currencies
- Standalone executable WAR with embedded Jetty
- [Para Web Console](https://console.paraio.org) - admin user interface

### Architecture

<pre>
+----------------------------------------------------------+
|                  ____  ___ _ ____ ___ _                  |
|                 / __ \/ __` / ___/ __` /                 |
|                / /_/ / /_/ / /  / /_/ /                  |
|               / .___/\__,_/_/   \__,_/     +-------------+
|              /_/                           | Persistence |
+-------------------+  +-----------------+   +-------------+
|      REST API     |  |     Search      |---|    Cache    |
+---------+---------+--+--------+--------+---+------+------+
          |                     |                   |
+---------+---------+  +--------+--------+   +------+------+
|  Signed Requests  |  |  Search Index   |   |  Data Store |
|  and JWT Tokens   |  | (ElasticSearch) |   |    (Any)    |
+----+---------^----+  +-----------------+   +-------------+
     |         |
+----v---------+-------------------------------------------+
|  Clients : JavaScript, PHP, Java, C#, Android, iOS, etc. |
+----------------------------------------------------------+
</pre>

## Documentation

### [Read the Docs](https://paraio.org/docs)

## Quick Start

1. [Download the latest executable WAR](https://github.com/Erudika/para/releases)
2. Execute it with `java -jar -Dconfig.file=./application.conf para-X.Y.Z.war`
3. Call `curl localhost:8080/v1/_setup` to get the access and secret keys
4. Open [Para Web Console](https://console.paraio.org) or integrate with one of the API clients below.

Configuration properties belong in your `application.conf` file.
Here's an example configuration for development purposes:
```
# the name of your app
para.app_name = "My App"
# or set it to 'production'
para.env = "embedded"
# allows clients to register any user with any email
para.security.allow_unverified_emails = true
# if hosting multiple apps on Para, set this to false
para.clients_can_access_root_app = true
# no need for caching in dev mode
para.cache_enabled = false
# change this to a random string
para.app_secret_key = "b8db69a24a43f2ce134909f164a45263"
# enable API request signature checking
para.security.api_security = true
```

The quickest way to interact with Para is through the [command-line tool](https://github.com/Erudika/para-cli) (CLI):
```
$ npm install -g para-cli
$ para-cli ping
$ echo "{\"type\":\"todo\", \"name\": \"buy milk\"}" > todo.json
$ para-cli create todo.json --id todo1 --encodeId false
$ para read --id todo1
```

### Building Para

Para can be compiled with JDK 6 and up, but we recommend running it on JDK 8+.
<commit_msg>Typo fix<commit_after>![Logo](https://s3-eu-west-1.amazonaws.com/org.paraio/para.png)

## A general-purpose backend framework for the cloud.

[![Build Status](https://travis-ci.org/Erudika/para.svg?branch=master)](https://travis-ci.org/Erudika/para)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.erudika/para-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.erudika/para-core)
[![Join the chat at https://gitter.im/Erudika/para](https://badges.gitter.im/Erudika/para.svg)](https://gitter.im/Erudika/para?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)


**Para** was designed as a simple and modular backend framework for object persistence and retrieval.
It helps you build applications faster by taking care of the backend. It works on three levels -
objects are stored in a NoSQL data store or any old relational database, then automatically indexed
by a search engine and finally, cached.

The name "pára" means "steam" in Bulgarian. And just like steam is used to power stuff, you can use
Para to power your mobile or web application backend.

**Para** can be used as a direct dependency to your JVM-based application or as a standalone API server with
multiple applications and clients connecting to it.

See how **Para** [compares to other open source backend frameworks](https://erudika.com/blog/2015/10/21/backend-frameworks-usergrid-loopback-para-baasbox-deployd-telepat/).

### Features

- RESTful JSON API secured with Amazon's Signature 4 algorithm
- Database-agnostic, designed for scalable data stores (DynamoDB, Cassandra, MongoDB, etc.)
- Full-text search (Elasticsearch by default)
- Distributed object cache (Hazelcast by default)
- Multi-tenancy support - each app has its own table, index and cache
- IoT support and integration with AWS and Azure
- Flexible security based on Spring Security (Social login, JWT support, CSRF protection, etc.)
- Simple but effective resource permissions for client access control
- Robust constraint validation mechanism based on JSR-303 and Hibernate Validator
- Per-object control of persistence, index and cache operations
- Modular design powered by Google Guice and support for plugins
- I18n utilities for translating language packs and working with currencies
- Standalone executable WAR with embedded Jetty
- [Para Web Console](https://console.paraio.org) - admin user interface

### Architecture

<pre>
+----------------------------------------------------------+
|                  ____  ___ _ ____ ___ _                  |
|                 / __ \/ __` / ___/ __` /                 |
|                / /_/ / /_/ / /  / /_/ /                  |
|               / .___/\__,_/_/   \__,_/     +-------------+
|              /_/                           | Persistence |
+-------------------+  +-----------------+   +-------------+
|      REST API     |  |     Search      |---|    Cache    |
+---------+---------+--+--------+--------+---+------+------+
          |                     |                   |
+---------+---------+  +--------+--------+   +------+------+
|  Signed Requests  |  |  Search Index   |   |  Data Store |
|  and JWT Tokens   |  | (ElasticSearch) |   |    (Any)    |
+----+---------^----+  +-----------------+   +-------------+
     |         |
+----v---------+-------------------------------------------+
|  Clients : JavaScript, PHP, Java, C#, Android, iOS, etc. |
+----------------------------------------------------------+
</pre>

## Documentation

### [Read the Docs](https://paraio.org/docs)

## Quick Start

1. [Download the latest executable WAR](https://github.com/Erudika/para/releases)
2. Execute it with `java -jar -Dconfig.file=./application.conf para-X.Y.Z.war`
3. Call `curl localhost:8080/v1/_setup` to get the access and secret keys
4. Open [Para Web Console](https://console.paraio.org) or integrate with one of the API clients below.

Configuration properties belong in your `application.conf` file.
Here's an example configuration for development purposes:
```
# the name of your app
para.app_name = "My App"
# or set it to 'production'
para.env = "embedded"
# allows clients to register any user with any email
para.security.allow_unverified_emails = true
# if hosting multiple apps on Para, set this to false
para.clients_can_access_root_app = true
# no need for caching in dev mode
para.cache_enabled = false
# change this to a random string
para.app_secret_key = "b8db69a24a43f2ce134909f164a45263"
# enable API request signature checking
para.security.api_security = true
```

The quickest way to interact with Para is through the [command-line tool](https://github.com/Erudika/para-cli) (CLI):
```
$ npm install -g para-cli
$ para-cli ping
$ echo "{\"type\":\"todo\", \"name\": \"buy milk\"}" > todo.json
$ para-cli create todo.json --id todo1 --encodeId false
$ para-cli read --id todo1
$ para-cli search "type:todo"
```

### Building Para

Para can be compiled with JDK 6 and up, but we recommend running it on JDK 8+.

{'fraction_non_alphanumeric': 0.1821095862967044, 'fraction_numerical': 0.010217369528197937, 'mean_word_length': 2.3616161616161615, 'pattern_counts': {'":': 4, '<': 7, '<?xml version=': 0, '>': 9, 'https://': 28, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 10, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7600007', 'n_tokens_mistral': 2999, 'n_tokens_neox': 2806, 'n_words': 928}