Slim3 is a full-stack MVC framework optimized for Google App Engine/Java, and you can use Slim3 as just a datastore framework, too.

Our main concept is "Simple" and "Less Is More". "Less is more" means simplicity and clarity lead to good design.

80% of the effects come from 20% of the causes. This is known as The Pareto Principle. We concentrate all our energies into 20% of the causes. Programmers can resolve the other issues without framework constraints.

We want to get rid of complex and bloated features from your applications and our framework. As a result, we will slim down.

Slim3 is an open source framework. The license is Apache License, Version 2.0.

The main features of Slim3 are as follows:

Fast spin-up

If an app is idle, App Engine spins down it a short time(2 or 3 minutes) later and will spin up a new instance when a request comes in for it. Also, when the load increases, App Engine will spin up a new instance. So fast spin-up is very important when you use App Engine.

Slim3 does not use PersistenceManagerFactory/EntityManagerFactory which is known as a slow starter and avoids extra initializations carefully, so Slim3 spins up fast. It takes around 1100 cpu_ms.

HOT reloading

Slim3 supports HOT reloading. HOT reloading means a new version of a class is automatically reloaded on the fly. Due to HOT reloading, when you change the source code, you can see the latest result on your browser without restarting web application.

Type safe query

Slim3 supports a type-safe query as follows:

EmployeeMeta e = EmployeeMeta.get();
List<Employee> list = Datastore.query(e)
    .filter(e.salary.greaterThan(5000), e.job.equal("ANALYST"))

A meta data of a model like EmployeeMeta is created by Annotation Processing Tool automatically.

An equivalent JDO query is as follows:
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
    Query query = pm.newQuery(Employee.class);
    query.setFilter("salary > :salary && job == :job");
    query.setOrdering("salary asc");
    List<Employee> list = (List<Employee>) query.execute(5000, "ANALYST");
} finally {

If you use a query based on string, a compiler can not report an error when refactoring the property name.
If you use a type-safe query, when you rename "salary" property, a compiler will tell you "salary" no longer exists, because the meta data of the model is recreated by Annotation Processing Tool when refactoring.