# Para > Para is an open-source, stateless and schemaless backend with a REST API over any database, search index and cache. Self-host it anywhere, or let Para Cloud run it for you. ## Documentation - [Documentation](/docs/index.md): Para is a stateless, schemaless backend with a REST API over pluggable persistence, search, and cache layers. Start with the quickstart, then open the topic you need. - [Quickstart](/docs/getting-started/quickstart.md): Para is a flexible backend service, created as an open-source project from the very beginning, in 2013. It was born out of our need to have a robust system which would allow us… - [Self-hosting Para](/docs/deployment/standalone.md): 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… - [Maven & Gradle](/docs/getting-started/maven.md): Para is hosted on Maven Central. To add it to your project just include this into your pom.xml: - [MCP Server](/docs/getting-started/mcp-server.md): The Para MCP server exposes Para's backend services over the Model Context Protocol, enabling AI assistants like Claude to interact with your Para backend for configuration… - [The ParaObject interface](/docs/concepts/paraobject.md): All domain classes in Para implement the ParaObject interface which gives objects basic common properties like id, timestamp, name, etc. Let's say you have a plain old Java… - [Basic Configuration](/docs/configuration/configuration.md): Once deployed, Para will initialize itself by loading the default configuration file reference.conf. To load your own configuration you need to set one of the following system… - [Modules](/docs/plugins/modules.md): In the para-server package, there are several core modules: - [Environment profiles](/docs/configuration/environments.md): para.env is an important configuration property that turns features on and off. There are two main values for it - development, production, but you can define more. - [Plugins](/docs/plugins/plugins.md): Para will look for various plugins like IOListeners, CustomResourceHandlers, DAOs etc, on startup. The folder in which plugins JARs should be placed is ./lib/, by default, but… - [Core classes](/docs/concepts/core-classes.md): In the package com.erudika.para.core there are a number of core domain classes that are used throughout Para. These are common classes like User and App which you can use in… - [Serialization](/docs/concepts/serialization.md): Para handles serialization and deserialization using a combination of Jackson, BeanUtils and Java reflection. The process happens in the ParaObjectUtils class, and more… - [User-defined classes](/docs/concepts/user-defined-types.md): Let's say you have a class Article in your application that you wish to persist. You first implement the ParaObject interface, then add a few data fields to it. Implementing… - [Apps](/docs/concepts/apps.md): Apps allow you to have separate namespaces and data models for different purposes. Each app lives in its own separate database table and is independent from apps. - [Resource permissions](/docs/concepts/resource-permissions.md): When creating new users, we usually want to specify which resources they can access. This is why we added a few methods for adding and removing resource permissions. Each app… - [Validations](/docs/concepts/validations.md): Para supports JSR-303 validation annotations and also allows you to define validation constraints in two different ways. One way is to attach annotations to fields in Java… - [Webhooks](/docs/concepts/webhooks.md): Webhook were implemented in v1.32.0. The implementation is fully asynchronous and uses a queue for decoupling the message publishing from the actual processing and delivery of… - [DAO interface](/docs/data-stores/dao-interface.md): The DAO interface declares the following methods: - [Cassandra](/docs/data-stores/cassandra.md): The Cassandra plugin adds support for Apache Cassandra. The class CassandraDAO is a DAO implementation and is responsible for connecting to a Cassandra cluster and… - [DynamoDB](/docs/data-stores/dynamodb.md): Para can work with DynamoDB by using the DynamoDB DAO plugin which provides the AWSDynamoDAO implementation. That class is responsible for connecting to Amazon's DynamoDB… - [MongoDB](/docs/data-stores/mongodb.md): Since v1.18.0 Para supports plugins and the the first official plugin adds support for MongoDB. The class MongoDBDAO is a DAO implementation and is responsible for connecting… - [Generic SQL](/docs/data-stores/sql.md): Besides the default H2 implementation, there's a generic SQL DAO plugin which adds support for all the major RDBMS - MySQL/MariaDB, PostgreSQL, Microsoft SQL Server, Oracle and… - [H2 DB](/docs/data-stores/h2.md): This is the default database for object storage since v1.25. It is lightweight and embedded, which speeds up the startup of the server. All tables are stored inside a ./data… - [Search interface](/docs/search/search-interface.md): Para indexes objects based on their type. For example, a User objects has a type field with the value "user". Most of the search methods below ask for a type to search for… - [Elasticsearch](/docs/search/elasticsearch.md): Now part of the para-search-elasticsearch plugin. - [Lucene](/docs/search/lucene.md): Lucene is used as the default search engine in Para. It is a lightweight alternative to Elasticsearch for self-contained deployments. It works great for local development and… - [Cache interface](/docs/cache/cache-interface.md): The Cache interface defines the following methods used for object caching: - [Caffeine](/docs/cache/caffeine.md): Caffeine is the default cache implementation since v1.26. It's built on top of the excellent Caffeine library by Ben Manes. This cache supports automatic eviction and TTL for… - [Hazelcast](/docs/cache/hazelcast.md): Hazelcast allows you to use a portion of the memory on each node for caching without having to manage a separate caching server or cluster. Hazelcast was the default… - [One-to-many relationships](/docs/concepts/one-to-many.md): Object relationships are defined by the Linkable interface. All Para objects are linkable, meaning that they can be related to other Para objects. - [Many-to-many relationships](/docs/concepts/many-to-many.md): Many-to-many relationships are implemented in Para with Linker objects. This object contains information about a link between two objects. This is simply the id and type of… - [Collecting metrics](/docs/operations/observability/overview.md): With version 1.27, a number of metrics are implemented on top of DropWizard. By default, DropWizard metrics are captured for every application, as well as the overall system… - [Health check](/docs/operations/observability/health.md): A simple health check is mapped to /v1/health which returns 200 OK if the server is "healthy", and 500 if it's "unhealthy". The health check is configured to simply read the… - [Logging](/docs/operations/observability/logging.md): Para uses SLF4J as a logging abstraction framework, meaning you can plug in any logging implementation like Logback, Log4j2, etc. By default Para uses Logback. To use another… - [Translations](/docs/operations/i18n/translations.md): Translations are Para objects which contain a single translation of a string. For example you can have a language file in English and for each string you can create a… - [Languages](/docs/operations/i18n/languages.md): Languages are maps of keys and values. A language file might contain all strings used by an application. Also you can have the language loaded from a database. - [Filters](/docs/integrations/filters.md): There are several filters you can use to enable different features like Gzip encoding, CORS, etc. - [Misc. utilities](/docs/utilities/overview.md): The Utils static class contains a variety of utility methods. These are summarized below: - [HumanTime](/docs/utilities/human-time.md): Para includes the class HumanTime written by Johann Burkard. This class makes it easy to convert a timestamp to an approximation in the form of "X minutes ago". - [Pager](/docs/utilities/pagination.md): The Pager class is used for pagination. It holds data about a page request. For example you can call a search method like this: - [Email & SMTP](/docs/integrations/email.md): Para has a dedicated API endpoint for sending emails at /v1/emails. It allows you to send transactional emails with a direct API request to /v1/emails, authenticated by API key… - [Form handling](/docs/integrations/forms.md): Para provides HTML form handling and sending emails from structured form submissions in two modes: - [Queue](/docs/integrations/queue.md): The Queue interface is another simple API for pushing and pulling messages to and from a queue. - [Storage](/docs/integrations/file-storage.md): The FileStore interface allows you to have different storage services, like S3 or Google Drive, connected to your application. You can save and load files from disk or cloud… - [Custom authentication](/docs/security/passwordless.md): Para supports custom authentication providers through its "passwordless" filter. This means that you can send any user info to Para and it will authenticate that user… - [Simple authentication](/docs/security/passwords.md): Para implements several authentication mechanisms which you can integrate in your application and make it easy to handle user registrations and logins. - [SAML support](/docs/security/saml.md): Para can act as a SAML service provider and connect to a specified identity provider (IDP). The implementation uses OneLogin's SAML Java Toolkit. Here's a summary of all the… - [LDAP support](/docs/security/ldap.md): Users can be authenticated through an LDAP server, including Active Directory. The implementation uses the UnboundID SDK in combination with Spring Security. The user supplies… - [OAuth 2.0 support](/docs/security/oauth2.md): A generic OAuth 2.0 filter is available for situations where you need to use your own authentication server. It follows the standard OAuth 2.0 flow and requires that you… - [Facebook support](/docs/security/id-providers/facebook.md): This describes the web authentication flow with Facebook. You could also login with an existing access token from Facebook through the API. This web flow sets a cookie, the API… - [GitHub support](/docs/security/id-providers/github.md): This describes the web authentication flow with GitHub. You could also login with an existing access token from GitHub through the API. This web flow sets a cookie, the API… - [Google support](/docs/security/id-providers/google.md): This describes the web authentication flow with Google. You could also login with an existing access token from Google through the API. This web flow sets a cookie, the API… - [LinkedIn support](/docs/security/id-providers/linkedin.md): This describes the web authentication flow with LinkedIn. You could also login with an existing access token from LinkedIn through the API. This web flow sets a cookie, the API… - [Microsoft support](/docs/security/id-providers/microsoft.md): This describes the web authentication flow with Microsoft. You could also login with an existing access token from Microsoft through the API. This web flow sets a cookie, the… - [Slack support](/docs/security/id-providers/slack.md): This describes the web authentication flow with Slack. You could also login with an existing access token from Slack through the API. This web flow sets a cookie, the API… - [Twitter support](/docs/security/id-providers/twitter.md): This describes the web authentication flow with Twitter. You could also login with an existing access token from Twitter through the API. This web flow sets a cookie, the API… - [Amazon support](/docs/security/id-providers/amazon.md): This describes the web authentication flow with Amazon. You could also login with an existing access token from Amazon through the API. This web flow sets a cookie, the API… - [Groups and roles](/docs/security/roles.md): Para defines three security groups and roles: - [CSRF protection](/docs/security/csrf.md): Cross-Site Request Forgery protection is enabled by default for all POST, PUT and DELETE requests. It works by verifying that incoming requests contain a security token (CSRF… - [API Authentication](/docs/security/rest-api-authentication.md): Para uses the AWS Signature Version 4 algorithm for signing API requests. We chose this algorithm instead of OAuth because it is less complicated and is already implemented… - [Para API Reference](/docs/reference/para-api.md): {.sl-container { margin-left: 0; } @media (max-width: 1200px) { .sl-container { max-width: 100% !important; } } @media (min-width: 1200px) { .sl-container { max-width: 80%… - [Cloud Deployment](/docs/deployment/cloud.md): Para can be deployed to any cloud provider that supports Docker containers or Java applications. - [Docker & Kubernetes](/docs/deployment/docker.md): 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 :lateststable because the… - [Para Architecture](/docs/getting-started/architecture.md): Para is a stateless, schemaless, 3-layer backend system with a REST API in front of it. The first layer is the database, the second layer is the search index and the third --… - [Configuration Reference](/docs/reference/configuration.md): { .sl-container { margin-left: 0; } .sl-markdown-content, .sl-container { width: 100%; } .sl-markdown-content kbd { border: 1px solid 702000; background-color: ffd47d; color:… ## Project - [Para on GitHub](https://github.com/Erudika/para) - [Para Cloud](https://paraio.com)