diff --git a/Cargo.lock b/Cargo.lock
index a7e9b54..70d75f8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1405,16 +1405,24 @@ dependencies = [
[[package]]
name = "jsonwebtoken"
-version = "9.3.1"
+version = "10.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde"
+checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e"
dependencies = [
"base64 0.22.1",
+ "ed25519-dalek",
+ "getrandom 0.2.16",
+ "hmac",
"js-sys",
+ "p256",
+ "p384",
"pem",
- "ring",
+ "rand 0.8.5",
+ "rsa",
"serde",
"serde_json",
+ "sha2",
+ "signature",
"simple_asn1",
]
diff --git a/README.md b/README.md
index 622828b..c0afebb 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,20 @@ A production-ready, modular Rust API template for K-Suite applications, followin
## Quick Start
-### 1. Clone and Configure
+### Option 1: Use cargo-generate (Recommended)
+
+```bash
+cargo generate --git https://github.com/GKaszewski/k-template.git
+```
+
+You'll be prompted to choose:
+- **Project name**: Your new service name
+- **Database**: `sqlite` or `postgres`
+- **Session auth**: Enable cookie-based sessions
+- **JWT auth**: Enable Bearer token authentication
+- **OIDC**: Enable OpenID Connect integration
+
+### Option 2: Clone directly
```bash
git clone https://github.com/GKaszewski/k-template.git my-api
@@ -22,7 +35,7 @@ cp .env.example .env
# Edit .env with your configuration
```
-### 2. Run
+### Run
```bash
# Development (with hot reload via cargo-watch)
diff --git a/api/Cargo.toml b/api/Cargo.toml
index 1aec6a4..402bdc3 100644
--- a/api/Cargo.toml
+++ b/api/Cargo.toml
@@ -5,7 +5,7 @@ edition = "2024"
default-run = "api"
[features]
-default = ["sqlite", "auth-axum-login", "auth-oidc", "auth-jwt"]
+default = ["sqlite"]
sqlite = ["infra/sqlite", "tower-sessions-sqlx-store/sqlite"]
postgres = ["infra/postgres", "tower-sessions-sqlx-store/postgres"]
auth-axum-login = ["infra/auth-axum-login"]
diff --git a/api/Cargo.toml.template b/api/Cargo.toml.template
new file mode 100644
index 0000000..0db268c
--- /dev/null
+++ b/api/Cargo.toml.template
@@ -0,0 +1,63 @@
+[package]
+name = "api"
+version = "0.1.0"
+edition = "2024"
+default-run = "api"
+
+[features]
+default = ["{{database}}"{% if auth_session %}, "auth-axum-login"{% endif %}{% if auth_oidc %}, "auth-oidc"{% endif %}{% if auth_jwt %}, "auth-jwt"{% endif %}]
+sqlite = ["infra/sqlite", "tower-sessions-sqlx-store/sqlite"]
+postgres = ["infra/postgres", "tower-sessions-sqlx-store/postgres"]
+auth-axum-login = ["infra/auth-axum-login"]
+auth-oidc = ["infra/auth-oidc"]
+auth-jwt = ["infra/auth-jwt"]
+auth-full = ["auth-axum-login", "auth-oidc", "auth-jwt"]
+
+[dependencies]
+k-core = { git = "https://git.gabrielkaszewski.dev/GKaszewski/k-core", features = [
+ "logging",
+ "db-sqlx",
+ "{{database}}",
+ "http",
+ "auth",
+ "sessions-db",
+] }
+domain = { path = "../domain" }
+infra = { path = "../infra", default-features = false, features = ["{{database}}"] }
+
+#Web framework
+axum = { version = "0.8.8", features = ["macros"] }
+tower = "0.5.2"
+tower-http = { version = "0.6.2", features = ["cors", "trace"] }
+
+# Authentication
+# Moved to infra
+tower-sessions-sqlx-store = { version = "0.15", features = ["{{database}}"] }
+# password-auth removed
+time = "0.3"
+async-trait = "0.1.89"
+
+# Async runtime
+tokio = { version = "1.48.0", features = ["full"] }
+
+# Serialization
+serde = { version = "1.0.228", features = ["derive"] }
+serde_json = "1.0"
+
+# Validation via domain newtypes (Email, Password)
+
+# Error handling
+thiserror = "2.0.17"
+anyhow = "1.0"
+
+# Utilities
+chrono = { version = "0.4.42", features = ["serde"] }
+uuid = { version = "1.19.0", features = ["v4", "serde"] }
+
+# Logging
+tracing = "0.1"
+tracing-subscriber = { version = "0.3.22", features = ["env-filter"] }
+
+dotenvy = "0.15.7"
+config = "0.15.19"
+tower-sessions = "0.14.0"
diff --git a/api/src/dto.rs b/api/src/dto.rs
index 99a2d88..3b3355a 100644
--- a/api/src/dto.rs
+++ b/api/src/dto.rs
@@ -10,6 +10,7 @@ use uuid::Uuid;
/// Login request with validated email and password newtypes
#[derive(Debug, Deserialize)]
+#[allow(dead_code)]
pub struct LoginRequest {
/// Email is validated on deserialization
pub email: Email,
@@ -19,6 +20,7 @@ pub struct LoginRequest {
/// Register request with validated email and password newtypes
#[derive(Debug, Deserialize)]
+#[allow(dead_code)]
pub struct RegisterRequest {
/// Email is validated on deserialization
pub email: Email,
diff --git a/api/src/extractors.rs b/api/src/extractors.rs
index bf7193b..d1cae72 100644
--- a/api/src/extractors.rs
+++ b/api/src/extractors.rs
@@ -131,20 +131,3 @@ async fn try_session_auth(parts: &mut Parts) -> Result