diff --git a/.gitignore b/.gitignore
index a1c2a238..39736a21 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,10 @@
+target/
+*.iml
+
+
+#############################################
+## Original contents from github template: ##
+#############################################
# Compiled class file
*.class
diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 00000000..fadf2cda
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 00000000..4a6308f6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,136 @@
+
+
+ 4.0.0
+
+ com.kingsrook.qqq
+ qqq-sample-deployment
+ 0.0-SNAPSHOT
+
+
+
+
+
+
+ UTF-8
+ UTF-8
+ 17
+ 17
+ true
+ true
+
+
+
+
+
+ com.kingsrook.qqq
+ qqq-backend-core
+ 0.0-SNAPSHOT
+ compile
+
+
+ com.kingsrook.qqq
+ qqq-backend-module-rdbms
+ 0.0-SNAPSHOT
+ compile
+
+
+ com.kingsrook.qqq
+ qqq-middleware-javalin
+ 0.0-SNAPSHOT
+ compile
+
+
+ com.kingsrook.qqq
+ qqq-middleware-picocli
+ 0.0-SNAPSHOT
+ compile
+
+
+
+
+ org.slf4j
+ slf4j-simple
+ 1.8.0-beta4
+
+
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 3.1.2
+
+
+ org.apache.logging.log4j
+ log4j-api
+ 2.14.1
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.14.1
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.8.1
+ test
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ -Xlint:unchecked
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 3.0.0-M5
+
+
+ org.apache.maven.plugins
+ maven-checkstyle-plugin
+ 3.1.2
+
+
+ com.puppycrawl.tools
+ checkstyle
+ 9.0
+
+
+
+
+ validate
+ validate
+
+ checkstyle.xml
+
+ UTF-8
+ true
+ false
+ true
+ warning
+ **/target/generated-sources/*.*
+
+
+
+ check
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/kingsrook/sampleapp/SampleCli.java b/src/main/java/com/kingsrook/sampleapp/SampleCli.java
new file mode 100644
index 00000000..3be09a5f
--- /dev/null
+++ b/src/main/java/com/kingsrook/sampleapp/SampleCli.java
@@ -0,0 +1,33 @@
+package com.kingsrook.sampleapp;
+
+
+import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
+import com.kingsrook.qqq.frontend.picocli.QPicoCliImplementation;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public class SampleCli
+{
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static void main(String[] args)
+ {
+ new SampleCli().run(args);
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ private void run(String[] args)
+ {
+ QInstance qInstance = SampleMetaDataProvider.defineInstance();
+ QPicoCliImplementation qPicoCliImplementation = new QPicoCliImplementation(qInstance);
+ int exitCode = qPicoCliImplementation.runCli("my-sample-cli", args);
+ System.exit(exitCode);
+ }
+}
diff --git a/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java
new file mode 100644
index 00000000..c48e2f14
--- /dev/null
+++ b/src/main/java/com/kingsrook/sampleapp/SampleJavalinServer.java
@@ -0,0 +1,45 @@
+package com.kingsrook.sampleapp;
+
+
+import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
+import com.kingsrook.qqq.backend.javalin.QJavalinImplementation;
+import io.javalin.Javalin;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public class SampleJavalinServer
+{
+ private static final Logger LOG = LogManager.getLogger(SampleJavalinServer.class);
+
+ private static final int PORT = 8000;
+
+ private QInstance qInstance;
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static void main(String[] args)
+ {
+ new SampleJavalinServer().startJavalinServer();
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public void startJavalinServer()
+ {
+ qInstance = SampleMetaDataProvider.defineInstance();
+
+ QJavalinImplementation qJavalinImplementation = new QJavalinImplementation(qInstance);
+ Javalin service = Javalin.create().start(PORT);
+ service.routes(qJavalinImplementation.getRoutes());
+ }
+
+}
diff --git a/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java
new file mode 100644
index 00000000..9802bb47
--- /dev/null
+++ b/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java
@@ -0,0 +1,96 @@
+package com.kingsrook.sampleapp;
+
+
+import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData;
+import com.kingsrook.qqq.backend.core.model.metadata.QFieldMetaData;
+import com.kingsrook.qqq.backend.core.model.metadata.QFieldType;
+import com.kingsrook.qqq.backend.core.model.metadata.QInstance;
+import com.kingsrook.qqq.backend.core.model.metadata.QTableMetaData;
+
+
+/*******************************************************************************
+ **
+ *******************************************************************************/
+public class SampleMetaDataProvider
+{
+ private static final String BACKEND_NAME = "default";
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static QInstance defineInstance()
+ {
+ QInstance qInstance = new QInstance();
+ qInstance.addBackend(SampleMetaDataProvider.defineBackend());
+ qInstance.addTable(SampleMetaDataProvider.defineTableCarrier());
+ qInstance.addTable(SampleMetaDataProvider.defineTablePerson());
+ return (qInstance);
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static QBackendMetaData defineBackend()
+ {
+ QBackendMetaData backend = new QBackendMetaData();
+ backend.setName(BACKEND_NAME);
+ backend.setType("rdbms");
+ backend.setValue("vendor", "mysql");
+ backend.setValue("hostName", "127.0.0.1");
+ backend.setValue("port", "3306");
+ backend.setValue("databaseName", "opspath");
+ backend.setValue("username", "root");
+ backend.setValue("password", "8BNWyoav8s79oi}Lqk");
+ return (backend);
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static QTableMetaData defineTableCarrier()
+ {
+ QTableMetaData table = new QTableMetaData();
+ table.setName("carrier");
+ table.setBackendName(BACKEND_NAME);
+ table.setPrimaryKeyField("id");
+
+ table.addField(new QFieldMetaData("id", QFieldType.INTEGER));
+
+ table.addField(new QFieldMetaData("name", QFieldType.STRING));
+
+ table.addField(new QFieldMetaData("company_code", QFieldType.STRING) // todo enum
+ .withLabel("Company")
+ .withBackendName("comp_code"));
+
+ table.addField(new QFieldMetaData("service_level", QFieldType.STRING)); // todo enum
+
+ return (table);
+ }
+
+
+
+ /*******************************************************************************
+ **
+ *******************************************************************************/
+ public static QTableMetaData defineTablePerson()
+ {
+ return new QTableMetaData()
+ .withName("person")
+ .withLabel("Person")
+ .withBackendName(BACKEND_NAME)
+ .withPrimaryKeyField("id")
+ .withField(new QFieldMetaData("id", QFieldType.INTEGER))
+ .withField(new QFieldMetaData("createDate", QFieldType.DATE_TIME).withBackendName("create_date"))
+ .withField(new QFieldMetaData("modifyDate", QFieldType.DATE_TIME).withBackendName("modify_date"))
+ .withField(new QFieldMetaData("firstName", QFieldType.STRING).withBackendName("first_name"))
+ .withField(new QFieldMetaData("lastName", QFieldType.STRING).withBackendName("last_name"))
+ .withField(new QFieldMetaData("birthDate", QFieldType.DATE).withBackendName("birth_date"))
+ .withField(new QFieldMetaData("email", QFieldType.STRING));
+ }
+}