diff --git a/datamodel-valkey/pom.xml b/datamodel-valkey/pom.xml
new file mode 100644
index 00000000..3fabf16c
--- /dev/null
+++ b/datamodel-valkey/pom.xml
@@ -0,0 +1,109 @@
+
+
+ 4.0.0
+
+ com.unitvectory
+ serviceauthcentral
+ 0.0.1-SNAPSHOT
+
+
+ com.unitvectory.serviceauthcentral
+ datamodel-valkey
+
+
+
+
+
+
+ com.unitvectory
+ consistgen
+
+
+ com.unitvectory.serviceauthcentral
+ util
+ ${project.version}
+
+
+ com.unitvectory.serviceauthcentral
+ datamodel
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+
+
+ org.mapstruct
+ mapstruct
+
+
+ org.projectlombok
+ lombok
+ provided
+
+
+ org.projectlombok
+ lombok-mapstruct-binding
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ test
+
+
+ org.mockito
+ mockito-core
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ ${project.build.directory}/generated-sources/annotations
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ org.mapstruct
+ mapstruct-processor
+ ${mapstruct.version}
+
+
+ org.projectlombok
+ lombok-mapstruct-binding
+ ${lombok-mapstruct-binding.version}
+
+
+
+
+
+
+
diff --git a/datamodel-valkey/src/lombok.config b/datamodel-valkey/src/lombok.config
new file mode 100644
index 00000000..fc53b467
--- /dev/null
+++ b/datamodel-valkey/src/lombok.config
@@ -0,0 +1,7 @@
+# This tells lombok this directory is the root,
+# no need to look somewhere else for java code.
+config.stopBubbling = true
+# This will add the @lombok.Generated annotation
+# to all the code generated by Lombok,
+# so it can be excluded from coverage by jacoco.
+lombok.addLombokGeneratedAnnotation = true
\ No newline at end of file
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/config/ValkeyConfig.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/config/ValkeyConfig.java
new file mode 100644
index 00000000..bfc1278f
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/config/ValkeyConfig.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import com.unitvectory.consistgen.epoch.EpochTimeProvider;
+import com.unitvectory.serviceauthcentral.datamodel.repository.AuthorizationRepository;
+import com.unitvectory.serviceauthcentral.datamodel.repository.ClientRepository;
+import com.unitvectory.serviceauthcentral.datamodel.repository.JwkCacheRepository;
+import com.unitvectory.serviceauthcentral.datamodel.repository.LoginCodeRepository;
+import com.unitvectory.serviceauthcentral.datamodel.repository.LoginStateRepository;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyAuthorizationRepository;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyClientRepository;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyJwkCacheRepository;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyLoginCodeRepository;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyLoginStateRepository;
+
+@Configuration
+@Profile("datamodel-valkey")
+public class ValkeyConfig {
+
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+
+ @Autowired
+ private EpochTimeProvider epochTimeProvider;
+
+ @Bean
+ public AuthorizationRepository authorizationRepository() {
+ return new ValkeyAuthorizationRepository(stringRedisTemplate, epochTimeProvider);
+ }
+
+ @Bean
+ public ClientRepository clientRepository() {
+ return new ValkeyClientRepository(stringRedisTemplate, epochTimeProvider);
+ }
+
+ @Bean
+ public JwkCacheRepository jwkCacheRepository() {
+ return new ValkeyJwkCacheRepository(stringRedisTemplate);
+ }
+
+ @Bean
+ public LoginCodeRepository loginCodeRepository() {
+ return new ValkeyLoginCodeRepository(stringRedisTemplate);
+ }
+
+ @Bean
+ public LoginStateRepository loginStateRepository() {
+ return new ValkeyLoginStateRepository(stringRedisTemplate);
+ }
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ClientScopeMapper.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ClientScopeMapper.java
new file mode 100644
index 00000000..f3653b78
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ClientScopeMapper.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.mapper;
+
+import java.util.List;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import com.unitvectory.serviceauthcentral.datamodel.valkey.model.ValkeyClientScope;
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientScope;
+
+/**
+ * The mapper for ClientScope
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Mapper
+public interface ClientScopeMapper {
+
+ ClientScopeMapper INSTANCE = Mappers.getMapper(ClientScopeMapper.class);
+
+ @Mapping(target = "scope", source = "scope")
+ @Mapping(target = "description", source = "description")
+ ValkeyClientScope clientScopeToValkeyClientScope(ClientScope clientScope);
+
+ List clientScopeToValkeyClientScope(List clientScopes);
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyCachedJwkMapper.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyCachedJwkMapper.java
new file mode 100644
index 00000000..13beae9e
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyCachedJwkMapper.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import com.unitvectory.serviceauthcentral.datamodel.valkey.model.ValkeyCachedJwk;
+import com.unitvectory.serviceauthcentral.datamodel.model.CachedJwk;
+
+/**
+ * The mapper for the ValkeyCachedJwk
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Mapper
+public interface ValkeyCachedJwkMapper {
+
+ ValkeyCachedJwkMapper INSTANCE = Mappers.getMapper(ValkeyCachedJwkMapper.class);
+
+ @Mapping(target = "url", source = "url")
+ @Mapping(target = "ttl", source = "ttl")
+ @Mapping(target = "valid", source = "jwk.valid")
+ @Mapping(target = "kid", source = "jwk.kid")
+ @Mapping(target = "kty", source = "jwk.kty")
+ @Mapping(target = "alg", source = "jwk.alg")
+ @Mapping(target = "use", source = "jwk.use")
+ @Mapping(target = "n", source = "jwk.n")
+ @Mapping(target = "e", source = "jwk.e")
+ ValkeyCachedJwk cachedJwkToValkeyCachedJwk(String url, long ttl, CachedJwk jwk);
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyClientSummaryMapper.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyClientSummaryMapper.java
new file mode 100644
index 00000000..8e98ce71
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/mapper/ValkeyClientSummaryMapper.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.mapper;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.factory.Mappers;
+
+import com.unitvectory.serviceauthcentral.datamodel.valkey.model.ValkeyClient;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.model.ValkeyClientSummary;
+
+/**
+ * The mapper for the ValkeyClientSummary
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Mapper
+public interface ValkeyClientSummaryMapper {
+
+ ValkeyClientSummaryMapper INSTANCE = Mappers.getMapper(ValkeyClientSummaryMapper.class);
+
+ @Mapping(target = "clientId", source = "clientId")
+ @Mapping(target = "description", source = "description")
+ ValkeyClientSummary valkeyClientToValkeyClientSummary(ValkeyClient client);
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyAuthorization.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyAuthorization.java
new file mode 100644
index 00000000..b170876c
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyAuthorization.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import java.util.List;
+import com.unitvectory.serviceauthcentral.datamodel.model.Authorization;
+import com.unitvectory.serviceauthcentral.util.HashingUtil;
+
+import lombok.Builder;
+import lombok.NonNull;
+import lombok.Value;
+
+/**
+ * The Valkey Authorization
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder
+public class ValkeyAuthorization implements Authorization {
+
+ private String authorizationCreated;
+
+ private String subject;
+
+ private String audience;
+
+ private List authorizedScopes;
+
+ public boolean matches(@NonNull String subject, @NonNull String audience) {
+ return subject.equals(this.subject) && audience.equals(this.audience);
+ }
+
+ @Override
+ public String getDocumentId() {
+ String subjectHash = HashingUtil.sha256(subject);
+ String audienceHash = HashingUtil.sha256(audience);
+ return HashingUtil.sha256(subjectHash + audienceHash);
+ }
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyCachedJwk.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyCachedJwk.java
new file mode 100644
index 00000000..0fccf258
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyCachedJwk.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.CachedJwk;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Cached JWK
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder
+@AllArgsConstructor
+public class ValkeyCachedJwk implements CachedJwk {
+
+ private String url;
+
+ private long ttl;
+
+ private boolean valid;
+
+ private String kid;
+
+ private String kty;
+
+ private String alg;
+
+ private String use;
+
+ private String n;
+
+ private String e;
+
+ @Override
+ public boolean isExpired(long now) {
+ return ttl < now;
+ }
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClient.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClient.java
new file mode 100644
index 00000000..eda3b5f1
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClient.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import java.util.List;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.Client;
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientJwtBearer;
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientScope;
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientType;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Client
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyClient implements Client {
+
+ private String clientId;
+
+ private String clientCreated;
+
+ private String description;
+
+ private String salt;
+
+ private ClientType clientType;
+
+ private String clientSecret1;
+
+ private String clientSecret1Updated;
+
+ private String clientSecret2;
+
+ private String clientSecret2Updated;
+
+ private List availableScopes;
+
+ private List jwtBearer;
+
+ private Boolean locked;
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientJwtBearer.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientJwtBearer.java
new file mode 100644
index 00000000..20ab5eb2
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientJwtBearer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientJwtBearer;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Client JWT Bearer
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyClientJwtBearer implements ClientJwtBearer {
+
+ private String id;
+
+ private String jwksUrl;
+
+ private String iss;
+
+ private String sub;
+
+ private String aud;
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientScope.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientScope.java
new file mode 100644
index 00000000..c181605d
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientScope.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientScope;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Client Scope
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyClientScope implements ClientScope {
+
+ private String scope;
+
+ private String description;
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientSummary.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientSummary.java
new file mode 100644
index 00000000..6b4b3095
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyClientSummary.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.ClientSummary;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Client Summary
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyClientSummary implements ClientSummary {
+
+ private String clientId;
+
+ private String description;
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginCode.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginCode.java
new file mode 100644
index 00000000..43ae8ef1
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginCode.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.LoginCode;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Login Code
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyLoginCode implements LoginCode {
+
+ private String clientId;
+
+ private String redirectUri;
+
+ private String codeChallenge;
+
+ private String userClientId;
+
+ private long ttl;
+
+ public long getTimeToLive() {
+ return this.ttl;
+ }
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginState.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginState.java
new file mode 100644
index 00000000..4edca443
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/model/ValkeyLoginState.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.model;
+
+import com.unitvectory.serviceauthcentral.datamodel.model.LoginState;
+
+import lombok.Builder;
+import lombok.Value;
+
+/**
+ * The Valkey Login State
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+@Value
+@Builder(toBuilder = true)
+public class ValkeyLoginState implements LoginState {
+
+ private String clientId;
+
+ private String redirectUri;
+
+ private String primaryState;
+
+ private String primaryCodeChallenge;
+
+ private String secondaryState;
+
+ private long ttl;
+}
diff --git a/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/repository/ValkeyAuthorizationRepository.java b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/repository/ValkeyAuthorizationRepository.java
new file mode 100644
index 00000000..f3d617ba
--- /dev/null
+++ b/datamodel-valkey/src/main/java/com/unitvectory/serviceauthcentral/datamodel/valkey/repository/ValkeyAuthorizationRepository.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright 2026 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.unitvectory.serviceauthcentral.datamodel.valkey.repository;
+
+import static com.unitvectory.serviceauthcentral.datamodel.valkey.repository.ValkeyHashUtil.*;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.unitvectory.consistgen.epoch.EpochTimeProvider;
+import com.unitvectory.serviceauthcentral.datamodel.model.Authorization;
+import com.unitvectory.serviceauthcentral.datamodel.repository.AuthorizationRepository;
+import com.unitvectory.serviceauthcentral.datamodel.time.TimeUtil;
+import com.unitvectory.serviceauthcentral.datamodel.valkey.model.ValkeyAuthorization;
+import com.unitvectory.serviceauthcentral.util.HashingUtil;
+import com.unitvectory.serviceauthcentral.util.exception.InternalServerErrorException;
+
+import lombok.NonNull;
+
+/**
+ * The Valkey Authorization Repository
+ *
+ * @author Jared Hatfield (UnitVectorY Labs)
+ */
+public class ValkeyAuthorizationRepository implements AuthorizationRepository {
+
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+ private static final String AUTH_KEY_PREFIX = "sac:auth:";
+ private static final String AUTH_SUBJECT_INDEX_PREFIX = "sac:auth:subject:";
+ private static final String AUTH_AUDIENCE_INDEX_PREFIX = "sac:auth:audience:";
+ private static final String AUTH_LOOKUP_PREFIX = "sac:auth:lookup:";
+
+ private final StringRedisTemplate redisTemplate;
+ private final EpochTimeProvider epochTimeProvider;
+
+ public ValkeyAuthorizationRepository(StringRedisTemplate redisTemplate,
+ EpochTimeProvider epochTimeProvider) {
+ this.redisTemplate = redisTemplate;
+ this.epochTimeProvider = epochTimeProvider;
+ }
+
+ private String authKey(String documentId) {
+ return AUTH_KEY_PREFIX + documentId;
+ }
+
+ private String subjectIndexKey(String subject) {
+ return AUTH_SUBJECT_INDEX_PREFIX + subject;
+ }
+
+ private String audienceIndexKey(String audience) {
+ return AUTH_AUDIENCE_INDEX_PREFIX + audience;
+ }
+
+ private String lookupKey(String subject, String audience) {
+ String subjectHash = HashingUtil.sha256(subject);
+ String audienceHash = HashingUtil.sha256(audience);
+ return AUTH_LOOKUP_PREFIX + subjectHash + ":" + audienceHash;
+ }
+
+ @Override
+ public Authorization getAuthorization(@NonNull String id) {
+ String key = authKey(id);
+ Map