Installation

Get your first Obsidian app running in minutes.

1. Clone the skeleton
Minimal
git clone https://github.com/obsidian-framework/obsidian my-app

Base structure with User model and auth system.

With authentication UI
git clone https://github.com/obsidian-framework/flint my-app

Includes login, register pages and dashboard out of the box.

2. Add the dependency

Add the JitPack repository and the Obsidian core dependency to your pom.xml:

Repository
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
Dependency
<dependency>
    <groupId>com.github.obsidian-framework</groupId>
    <artifactId>core</artifactId>
    <version>latest</version>
</dependency>

The skeleton already includes this — you only need to add it manually if you're starting from an empty project.

3. Configure exec-maven-plugin

Make sure your pom.xml points to your Main class:

<plugin>
    <groupId>com.obsidian.skeleton</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>3.1.0</version>
    <configuration>
        <mainClass>com.yourcompany.yourapp.Main</mainClass>
    </configuration>
</plugin>

The skeleton already includes this — just update the mainClass to match your package.

4. Configure your database

Create a .env file at the project root and fill in your database credentials. See the Database section for all available options.

5. Run the application
Development
mvn clean package exec:java

Compiles and starts the server in one step.

Production
mvn clean package
java -jar target/app.jar
⚠️ Prerequisites
  • • Java 17 or higher
  • • Maven 3.6+
  • • MySQL, PostgreSQL, or SQLite

Application Startup

Obsidian uses a convention-over-configuration approach — one line of code starts everything.

Entry point
public class Main {
    public static void main(String[] args) throws Exception {
        Obsidian.run(Main.class);
    }
}
Auto-discovery

When you call Obsidian.run(Main.class), the framework scans the package of your Main class and all its subpackages for annotated components. No XML, no manual registration.

@Controller Classes with route handlers (@GET, @POST, etc.)
@Repository Data access classes available for dependency injection
@UserDetailsServiceImpl Authentication service implementation
@GlobalAdvice Global interceptors executed before every request