MCPcopy Index your code
hub / github.com/Erudika/para

github.com/Erudika/para @1.54.7

Chat with this repo
repository ↗ · DeepWiki ↗ · release 1.54.7 ↗ · + Follow
2,768 symbols 11,238 edges 199 files 1,899 documented · 69%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Logo

A scalable, multitenant backend for the cloud.

Docker pulls Maven Central Version Join the chat at https://gitter.im/Erudika/para

Para is a scalable, multitenant backend server/framework for object persistence and retrieval. It helps you build and prototype applications faster by taking care of backend operations. It can be a part of your JVM-based application or it can be deployed as standalone, multitenant API server with multiple applications and clients connecting to it.

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.

See how Para compares to other open source backend frameworks.

This project is fully funded and supported by Erudika - an independent, bootstrapped company.

Features

  • RESTful JSON API secured with Amazon's Signature V4 algorithm
  • Database-agnostic, designed for scalable data stores (DynamoDB, Cassandra, MongoDB, etc.)
  • Full-text search (Lucene, Elasticsearch)
  • Distributed and local object cache (Hazelcast, Caffeine)
  • Multitenancy - each app has its own table, index and cache
  • Webhooks with signed payloads
  • Flexible security based on Spring Security (LDAP, SAML, social login, CSRF protection, etc.)
  • Stateless client authentication with JSON Web Tokens (JWT)
  • 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
  • Support for optimistic locking and transactions (implemented by each DAO natively)
  • Advanced serialization and deserialization capabilities (Jackson)
  • Full metrics for monitoring and diagnostics (Dropwizard)
  • Modular design powered by Google Guice and support for plugins
  • I18n utilities for translating language packs and working with currencies
  • Standalone executable JAR with embedded Jetty
  • HTML form handling with public endpoint accepting multipart/form-data requests
  • MCP server - allows AI agents to interact with your backend
  • Para Web Console - admin user interface

Architecture

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

Documentation

Read the Docs

Blog

Read more about Para on our blog

Hosting

We offer hosting and premium support at paraio.com where you can try Para online with a free developer account. Browse and manage your users and objects, do backups and edit permissions with a few clicks in the web console. By upgrading to a premium account you will be able to scale you projects up and down in seconds and manage multiple apps.

Quick Start

  1. Download the latest executable JAR
  2. Create a configuration file application.conf file in the same directory as the JAR package.
  3. Start Para with java -jar -Dconfig.file=./application.conf para-*.jar
  4. Install Para CLI with npm install -g para-cli
  5. Create a new dedicated app for your project and save the access keys:
# run setup and set endpoint to either 'http://localhost:8080' or 'https://paraio.com'
# the keys for the root app are inside application.conf
$ para-cli setup
$ para-cli new-app "myapp" --name "My App"

Alternatively, you can use the Para Web Console to manage data, or integrate Para directly into your project with one of the API clients below.

Docker

Tagged Docker images for Para are located at erudikaltd/para on Docker Hub. It's highly recommended that you pull only release images like :1.51.0 or :latest_stable because the :latest tag can be broken or unstable. First, create an application.conf file and a data folder and start the Para container:

$ touch application.conf && mkdir data
$ docker run -ti -p 8080:8080 --rm -v $(pwd)/data:/para/data \
  -v $(pwd)/application.conf:/para/application.conf \
  -e JAVA_OPTS="-Dconfig.file=/para/application.conf" erudikaltd/para:latest_stable

Environment variables

JAVA_OPTS - Java system properties, defaults to -Dloader.path=lib

Plugins

You can create a custom Para container with all plugins and JDBC drivers you need by using docker compose. Below is an example build of Para, using para-dao-sql, para-search-lucene and PosgreSQL as a database.

  1. First, create a new Dockerfile-plugins which does a multi-stage build like so:
  • View contents of Dockerfile-plugins
    ARG PARA_VERSION="0.0.0"
    ARG SQL_DAO_VERSION="0.0.0"
    FROM erudikaltd/para:v${PARA_VERSION} AS base
    FROM erudikaltd/para-dao-sql:${SQL_DAO_VERSION} AS dao
    FROM erudikaltd/para-search-lucene:${SEARCH_VERSION} AS search
    FROM base AS final
    COPY --from=dao /para/lib/*.jar /para/lib
    COPY --from=search /para/lib/*.jar /para/lib
    
    # EXAMPLE: Add a PostgreSQL JDBC Driver
    ARG PG_JDBC_VERSION="0.0.0"
    ADD https://jdbc.postgresql.org/download/postgresql-${PG_JDBC_VERSION}.jar /para/lib/
    
  1. Then, create a docker-compose.yml file:
  • View contents of docker-compose.yml
    services:
       para:
         depends_on:
           - db
         build:
           context: .
           dockerfile: Dockerfile
           args:
             PARA_VERSION: "1.51.0"
             SQL_DAO_VERSION: "1.49.1"
             PG_JDBC_VERSION: "42.7.7"
         image: para-with-plugins
         pull_policy: never
         ports:
           - "8080:8080"
         volumes:
           - type: volume
             source: paraData
             target: /para/data
           - type: volume
             source: paraLib
             target: /para/lib
           - type: bind
             source: ./para-application.conf
             target: /para/application.conf
         restart: always
         environment:
           - JAVA_OPTS=-Dconfig.file=/para/application.conf -Dloader.path=/para/lib
    
       db:
         image: postgres:latest
         ports:
           - "5432:5432"
         volumes:
           - type: volume
             source: postgresData
             target: /var/lib/postgresql/data
         restart: always
         environment:
           - POSTGRES_PASSWORD=mysecretpassword
           - PGDATA=/var/lib/postgresql/data
    volumes:
      paraData:
      paraLib:
      postgresData:
    
  1. Also reate the Para configuration file para-application.conf:
  • View contents of para-application.conf
    para.env = "production"
    para.dao = "SqlDAO"
    para.sql.driver = "org.postgresql.Driver"
    para.sql.url = "postgresql://db:5432/para"
    para.sql.user = "postgres"
    para.sql.password = "mysecretpassword"
    
  1. Finally, run docker compose build para && docker compose up

Kubernetes

There's a Helm chart inside the helm/ folder. First edit helm/para/values.yaml and then you can deploy Para to Kubernetes with a single command:

cd helm; helm install para ./para

For more info, check the quick start guide at helm/README.md.

Building Para

Para can be compiled with JDK 8+:

To compile it you'll need Maven. Once you have it, just clone and build:

$ git clone https://github.com/erudika/para.git && cd para
$ mvn install -DskipTests=true

To generate the executable "fat-jar" run $ mvn package and it will be in ./para-server/target/para-x.y.z-SNAPSHOT.jar. Two JAR files will be generated in total - the fat one is a bit bigger in size.

To build the native image of Para, run:

$ cd para-server && mvn -Pnative package

Note, that native images are platform-dependent, so an image built on x86-64 will not run on aarch64, for example.

To run a local instance of Para for development, use:

$ mvn -Dconfig.file=./application.conf spring-boot:run

Standalone server

Either download the executable JAR file and run it, or build it from scratch after cloning the Para repository. To build the "uber JAR" (fat JAR) file you need to enable it with the following Maven profiles:

mvn -Pfatjar,sql,lucene -DskipTests=true package

Finally, run Para server:

java -jar para-X.Y.Z.jar

The you can browse your objects through the Para Web Console console.paraio.org. Simply change the API endpoint to be your local server and connect your access keys. The admin interface is client-side only and your secret key is never sent over the the network. Instead, a JWT access token is generated locally and sent to the server on each request.

Download JAR

Maven dependency

You can also integrate Para with your project by adding it as a dependency. Para is hosted on Maven Central. Here's the Maven snippet to include in your pom.xml:

<dependency>
  <groupId>com.erudika</groupId>
  <artifactId>para-server</artifactId>
  <version>{see_green_version_badge_above}</version>
</dependency>

For building lightweight client-only applications connecting to Para, include only the client module:

<dependency>
  <groupId>com.erudika</groupId>
  <artifactId>para-client</artifactId>
  <version>{see_green_version_badge_above}</version>
</dependency>

Command-line tool

$ npm install -g para-cli

API clients

Use these client libraries to quickly integrate Para into your project:

Database integrations

Use these DAO implementations to connect to different databases:

Search engine integrations

The Search interface is implemented by:

Cache integrations

The Cache interface is implemented by:

  • Caffeine: objects are cached locally (included in para-server)
  • Hazelcast: para-cache-hazelcast (distributed)

Queue implementations

The Queue interface is implemented by:

  • Amazon SQS: para-queue-sqs plugin for Amazon SQS
  • LocalQueue for single-host deployments and local development

File storage implementations

The FileStore interface is implemented by:

  • Amazon S3: para-storage-s3 plugin for Amazon S3
  • LocalFileStore: for storing files to the local file system.

Emailer implementations

The Emailer interface is implemented by:

  • AWSEmailer: para-email-ses plugin for Amazon SES
  • JavaMailEmailer - the default JavaMail implementation for handling transaction emails

Projects using Para

Extension points exported contracts — how you extend this code

Votable (Interface)
This interface enables voting on an object. All core objects implement this and can be voted for. @author Alex Bogdanovs [9 …
para-core/src/main/java/com/erudika/para/core/Votable.java
NestedITs (Interface)
Integration tests for ParaClient & AWSDynamoDBDAO @author Alex Bogdanovski [alex@erudika.com]
para-server/src/test/java/com/erudika/para/core/NestedITs.java
ParaObject (Interface)
The core domain interface. All Para objects implement it. @author Alex Bogdanovski [alex@erudika.com] [18 implementers]
para-core/src/main/java/com/erudika/para/core/ParaObject.java
SigninPage (Interface)
Basic login page interface. Implement this to override the default Para login page. @author Alex Bogdanovski [alex@erudi
para-server/src/main/java/com/erudika/para/server/security/SigninPage.java
Linkable (Interface)
Applied to all ParaObjects by default. Allows an object to be linked to another object. A link can be: 1-1, 1- o [9 implementers]
para-core/src/main/java/com/erudika/para/core/Linkable.java
Cache (Interface)
This class manages object caching. An object is cached mainly for read performance and database offloading. The cache ca [4 …
para-core/src/main/java/com/erudika/para/core/cache/Cache.java
Emailer (Interface)
An email service. Used for sending emails. @author Alex Bogdanovski [alex@erudika.com] [4 implementers]
para-core/src/main/java/com/erudika/para/core/email/Emailer.java

Core symbols most depended-on inside this repo

put
called by 558
para-core/src/main/java/com/erudika/para/core/cache/Cache.java
get
called by 478
para-core/src/main/java/com/erudika/para/core/cache/Cache.java
getConfig
called by 368
para-core/src/main/java/com/erudika/para/core/utils/Para.java
getId
called by 323
para-core/src/main/java/com/erudika/para/core/ParaObject.java
isEmpty
called by 301
para-server/src/main/java/com/erudika/para/server/utils/HttpUtils.java
getInstance
called by 268
para-core/src/main/java/com/erudika/para/core/utils/CoreUtils.java
read
called by 210
para-core/src/main/java/com/erudika/para/core/persistence/DAO.java
getId
called by 186
para-core/src/main/java/com/erudika/para/core/Sysprop.java

Shape

Method 2,578
Class 160
Interface 19
Enum 11

Languages

Java100%

Modules by API surface

para-core/src/main/java/com/erudika/para/core/utils/ParaConfig.java209 symbols
para-client/src/main/java/com/erudika/para/client/ParaClient.java188 symbols
para-core/src/main/java/com/erudika/para/core/User.java121 symbols
para-core/src/main/java/com/erudika/para/core/App.java115 symbols
para-server/src/main/java/com/erudika/para/server/rest/Api1.java82 symbols
para-core/src/main/java/com/erudika/para/core/Linker.java69 symbols
para-core/src/main/java/com/erudika/para/core/Form.java66 symbols
para-core/src/main/java/com/erudika/para/core/Vote.java65 symbols
para-core/src/main/java/com/erudika/para/core/Translation.java63 symbols
para-core/src/main/java/com/erudika/para/core/Address.java63 symbols
para-core/src/main/java/com/erudika/para/core/Tag.java61 symbols
para-core/src/main/java/com/erudika/para/core/utils/Utils.java59 symbols

Datastores touched

paraDatabase · 1 repos

For agents

$ claude mcp add para \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact