Rewrite as a Spring Boot app on the Bennett platform
build-and-publish / build (push) Successful in 1m38s

Restores the real backend lost with Supabase (posts, authors, comments, subscriptions, admin) in
Postgres, seeds the existing markdown posts, and rebuilds the site as a Vite/React SPA served by
Spring — keeping the original styling (serif + tan accent) and content.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
This commit is contained in:
2026-07-22 20:35:51 -05:00
co-authored by Claude Opus 4.8
parent ba054ab2eb
commit cbe8a764b0
128 changed files with 3997 additions and 7685 deletions
@@ -0,0 +1,12 @@
package net.reformedwitness.cog;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ConfessionsApplication {
public static void main(String[] args) {
SpringApplication.run(ConfessionsApplication.class, args);
}
}
@@ -0,0 +1,40 @@
package net.reformedwitness.cog.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import net.thebennett.platform.data.BaseEntity;
@Entity
@Table(name = "author")
public class Author extends BaseEntity {
@Column(nullable = false, unique = true)
private String name;
@Column(columnDefinition = "text")
private String bio = "";
@Column(name = "x_link")
private String xLink;
@Column(name = "fb_link")
private String fbLink;
@Column(name = "insta_link")
private String instaLink;
@Column(name = "pfp_link")
private String pfpLink;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getBio() { return bio; }
public void setBio(String bio) { this.bio = bio; }
public String getXLink() { return xLink; }
public void setXLink(String xLink) { this.xLink = xLink; }
public String getFbLink() { return fbLink; }
public void setFbLink(String fbLink) { this.fbLink = fbLink; }
public String getInstaLink() { return instaLink; }
public void setInstaLink(String instaLink) { this.instaLink = instaLink; }
public String getPfpLink() { return pfpLink; }
public void setPfpLink(String pfpLink) { this.pfpLink = pfpLink; }
}
@@ -0,0 +1,33 @@
package net.reformedwitness.cog.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import net.thebennett.platform.data.BaseEntity;
@Entity
@Table(name = "comment")
public class Comment extends BaseEntity {
@Column(name = "post_slug", nullable = false)
private String postSlug;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column(columnDefinition = "text", nullable = false)
private String body;
public String getPostSlug() { return postSlug; }
public void setPostSlug(String postSlug) { this.postSlug = postSlug; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getBody() { return body; }
public void setBody(String body) { this.body = body; }
}
@@ -0,0 +1,71 @@
package net.reformedwitness.cog.domain;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.Table;
import net.thebennett.platform.data.BaseEntity;
@Entity
@Table(name = "post")
public class Post extends BaseEntity {
@Column(nullable = false, unique = true)
private String slug;
@Column(nullable = false)
private String title;
@Column(columnDefinition = "text")
private String excerpt = "";
private String author = "";
@Column(name = "cover_image")
private String coverImage;
@Column(name = "published_on", nullable = false)
private LocalDate publishedOn;
@Column(columnDefinition = "text")
private String content = "";
@Column(name = "content_html", columnDefinition = "text")
private String contentHtml = "";
private boolean published = true;
@ElementCollection(fetch = FetchType.EAGER)
@CollectionTable(name = "post_tags", joinColumns = @JoinColumn(name = "post_id"))
@Column(name = "tag")
private List<String> tags = new ArrayList<>();
public String getSlug() { return slug; }
public void setSlug(String slug) { this.slug = slug; }
public String getTitle() { return title; }
public void setTitle(String title) { this.title = title; }
public String getExcerpt() { return excerpt; }
public void setExcerpt(String excerpt) { this.excerpt = excerpt; }
public String getAuthor() { return author; }
public void setAuthor(String author) { this.author = author; }
public String getCoverImage() { return coverImage; }
public void setCoverImage(String coverImage) { this.coverImage = coverImage; }
public LocalDate getPublishedOn() { return publishedOn; }
public void setPublishedOn(LocalDate publishedOn) { this.publishedOn = publishedOn; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getContentHtml() { return contentHtml; }
public void setContentHtml(String contentHtml) { this.contentHtml = contentHtml; }
public boolean isPublished() { return published; }
public void setPublished(boolean published) { this.published = published; }
public List<String> getTags() { return tags; }
public void setTags(List<String> tags) { this.tags = tags; }
}
@@ -0,0 +1,18 @@
package net.reformedwitness.cog.domain;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import net.thebennett.platform.data.BaseEntity;
@Entity
@Table(name = "subscription")
public class Subscription extends BaseEntity {
@Column(nullable = false, unique = true)
private String email;
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
@@ -0,0 +1,15 @@
package net.reformedwitness.cog.repo;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import net.reformedwitness.cog.domain.Author;
public interface AuthorRepository extends JpaRepository<Author, Long> {
Optional<Author> findByName(String name);
List<Author> findAllByOrderByNameAsc();
}
@@ -0,0 +1,14 @@
package net.reformedwitness.cog.repo;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import net.reformedwitness.cog.domain.Comment;
public interface CommentRepository extends JpaRepository<Comment, Long> {
List<Comment> findByPostSlugOrderByCreatedAtAsc(String postSlug);
long countByPostSlug(String postSlug);
}
@@ -0,0 +1,29 @@
package net.reformedwitness.cog.repo;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import net.reformedwitness.cog.domain.Post;
public interface PostRepository extends JpaRepository<Post, Long> {
List<Post> findByPublishedTrueOrderByPublishedOnDescIdDesc();
List<Post> findByPublishedTrueAndAuthorOrderByPublishedOnDescIdDesc(String author);
Optional<Post> findBySlug(String slug);
boolean existsBySlug(String slug);
@Query("select distinct p from Post p join p.tags t "
+ "where p.published = true and t = :tag order by p.publishedOn desc, p.id desc")
List<Post> findPublishedByTag(@Param("tag") String tag);
/** [tag, count] for every tag used by a published post. */
@Query("select t, count(p) from Post p join p.tags t where p.published = true group by t order by t")
List<Object[]> tagCounts();
}
@@ -0,0 +1,10 @@
package net.reformedwitness.cog.repo;
import org.springframework.data.jpa.repository.JpaRepository;
import net.reformedwitness.cog.domain.Subscription;
public interface SubscriptionRepository extends JpaRepository<Subscription, Long> {
boolean existsByEmail(String email);
}
@@ -0,0 +1,154 @@
package net.reformedwitness.cog.service;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import net.reformedwitness.cog.domain.Author;
import net.reformedwitness.cog.domain.Post;
import net.reformedwitness.cog.repo.AuthorRepository;
import net.reformedwitness.cog.repo.PostRepository;
/** On first run (empty DB), seeds posts from the bundled markdown and derives authors from them. */
@Component
public class ContentSeeder implements ApplicationRunner {
private static final Logger log = LoggerFactory.getLogger(ContentSeeder.class);
private final PostRepository posts;
private final AuthorRepository authors;
private final MarkdownService markdown;
private final ResourcePatternResolver resolver;
public ContentSeeder(PostRepository posts, AuthorRepository authors, MarkdownService markdown, ResourceLoader rl) {
this.posts = posts;
this.authors = authors;
this.markdown = markdown;
this.resolver = ResourcePatternUtils.getResourcePatternResolver(rl);
}
@Override
@Transactional
public void run(ApplicationArguments args) throws Exception {
if (posts.count() > 0) {
return;
}
Resource[] files = resolver.getResources("classpath:seed/posts/*.md");
Set<String> authorNames = new LinkedHashSet<>();
for (Resource file : files) {
String name = file.getFilename();
if (name == null) {
continue;
}
String slug = name.replaceAll("\\.md$", "");
String raw = new String(file.getInputStream().readAllBytes(), StandardCharsets.UTF_8);
var rendered = markdown.render(raw);
Map<String, List<String>> fm = rendered.frontMatter();
Post p = new Post();
p.setSlug(slug);
p.setTitle(first(fm, "title", slug));
p.setPublishedOn(parseDate(first(fm, "date", "2020-01-01")));
p.setExcerpt(first(fm, "excerpt", ""));
p.setAuthor(first(fm, "author", ""));
p.setCoverImage(firstOrNull(fm, "coverImage"));
p.setTags(parseTags(fm));
p.setContent(stripFrontMatter(raw));
p.setContentHtml(rendered.html());
p.setPublished(true);
posts.save(p);
if (!p.getAuthor().isBlank()) {
authorNames.add(p.getAuthor());
}
}
for (String authorName : authorNames) {
if (authors.findByName(authorName).isEmpty()) {
Author a = new Author();
a.setName(authorName);
authors.save(a);
}
}
log.info("Seeded {} posts, {} authors", posts.count(), authorNames.size());
}
private static String first(Map<String, List<String>> fm, String key, String def) {
List<String> v = fm.get(key);
return (v != null && !v.isEmpty()) ? unquote(v.get(0)) : def;
}
private static String firstOrNull(Map<String, List<String>> fm, String key) {
List<String> v = fm.get(key);
return (v != null && !v.isEmpty()) ? unquote(v.get(0)) : null;
}
/** Strip surrounding single/double quotes left by the front-matter parser. */
private static String unquote(String s) {
String t = s == null ? "" : s.trim();
if (t.length() >= 2
&& ((t.startsWith("\"") && t.endsWith("\"")) || (t.startsWith("'") && t.endsWith("'")))) {
t = t.substring(1, t.length() - 1);
}
return t.trim();
}
/**
* The front-matter parser doesn't split inline flow arrays, so {@code tags: ["a", "b"]} arrives as one
* string. Handle both that and normal block lists, and cap length to the column width.
*/
private static List<String> parseTags(Map<String, List<String>> fm) {
List<String> out = new ArrayList<>();
for (String value : fm.getOrDefault("tags", List.of())) {
String s = value == null ? "" : value.trim();
if (s.startsWith("[") && s.endsWith("]")) {
s = s.substring(1, s.length() - 1);
for (String part : s.split(",")) {
addTag(out, part);
}
} else {
addTag(out, s);
}
}
return out;
}
private static void addTag(List<String> out, String raw) {
String tag = unquote(raw);
if (!tag.isEmpty() && tag.length() <= 80 && !out.contains(tag)) {
out.add(tag);
}
}
private static LocalDate parseDate(String s) {
try {
return LocalDate.parse(s);
} catch (Exception e) {
return LocalDate.of(2020, 1, 1);
}
}
private static String stripFrontMatter(String raw) {
if (raw.startsWith("---")) {
int end = raw.indexOf("\n---", 3);
if (end >= 0) {
int nl = raw.indexOf('\n', end + 1);
return nl >= 0 ? raw.substring(nl + 1).stripLeading() : "";
}
}
return raw;
}
}
@@ -0,0 +1,40 @@
package net.reformedwitness.cog.service;
import java.util.List;
import java.util.Map;
import org.commonmark.ext.front.matter.YamlFrontMatterExtension;
import org.commonmark.ext.front.matter.YamlFrontMatterVisitor;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
import org.springframework.stereotype.Service;
/** Renders markdown (with optional YAML front matter) to HTML. */
@Service
public class MarkdownService {
private final Parser parser;
private final HtmlRenderer renderer;
public MarkdownService() {
var extensions = List.of(YamlFrontMatterExtension.create());
this.parser = Parser.builder().extensions(extensions).build();
this.renderer = HtmlRenderer.builder().extensions(extensions).build();
}
public record Rendered(Map<String, List<String>> frontMatter, String html) {
}
public Rendered render(String markdown) {
Node document = parser.parse(markdown);
var visitor = new YamlFrontMatterVisitor();
document.accept(visitor);
return new Rendered(visitor.getData(), renderer.render(document));
}
/** Render body-only markdown (no front matter expected) to HTML. */
public String toHtml(String markdown) {
return renderer.render(parser.parse(markdown == null ? "" : markdown));
}
}
@@ -0,0 +1,94 @@
package net.reformedwitness.cog.web;
import java.time.LocalDate;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import net.reformedwitness.cog.domain.Author;
import net.reformedwitness.cog.domain.Post;
import net.reformedwitness.cog.repo.AuthorRepository;
import net.reformedwitness.cog.repo.CommentRepository;
import net.reformedwitness.cog.repo.PostRepository;
import net.reformedwitness.cog.service.MarkdownService;
/** Admin API — requires an Authentik login (not in security permit-paths). */
@RestController
@RequestMapping("/api/admin")
public class AdminController {
private final PostRepository posts;
private final CommentRepository comments;
private final AuthorRepository authors;
private final MarkdownService markdown;
public AdminController(PostRepository posts, CommentRepository comments, AuthorRepository authors,
MarkdownService markdown) {
this.posts = posts;
this.comments = comments;
this.authors = authors;
this.markdown = markdown;
}
@PostMapping("/posts")
@ResponseStatus(HttpStatus.CREATED)
public Dto.PostDetail create(@RequestBody Dto.PostRequest req) {
if (req.slug() == null || req.slug().isBlank()) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "slug required");
}
if (posts.existsBySlug(req.slug())) {
throw new ResponseStatusException(HttpStatus.CONFLICT, "slug already exists");
}
return Dto.detail(save(new Post(), req));
}
@PutMapping("/posts/{slug}")
public Dto.PostDetail update(@PathVariable String slug, @RequestBody Dto.PostRequest req) {
Post p = posts.findBySlug(slug)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "post not found"));
return Dto.detail(save(p, req));
}
@DeleteMapping("/posts/{slug}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deletePost(@PathVariable String slug) {
Post p = posts.findBySlug(slug)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "post not found"));
posts.delete(p);
}
@DeleteMapping("/comments/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void deleteComment(@PathVariable Long id) {
comments.deleteById(id);
}
private Post save(Post p, Dto.PostRequest req) {
p.setSlug(req.slug());
p.setTitle(req.title() != null ? req.title() : req.slug());
p.setPublishedOn(req.date() != null && !req.date().isBlank() ? LocalDate.parse(req.date()) : LocalDate.now());
p.setExcerpt(req.excerpt() != null ? req.excerpt() : "");
p.setAuthor(req.author() != null ? req.author() : "");
p.setCoverImage(req.coverImage());
p.setTags(req.tags() != null ? req.tags() : List.of());
p.setContent(req.content() != null ? req.content() : "");
p.setContentHtml(markdown.toHtml(req.content()));
p.setPublished(req.published() == null || req.published());
if (!p.getAuthor().isBlank() && authors.findByName(p.getAuthor()).isEmpty()) {
Author a = new Author();
a.setName(p.getAuthor());
authors.save(a);
}
return posts.save(p);
}
}
@@ -0,0 +1,45 @@
package net.reformedwitness.cog.web;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import net.reformedwitness.cog.domain.Author;
import net.reformedwitness.cog.repo.AuthorRepository;
import net.reformedwitness.cog.repo.PostRepository;
@RestController
@RequestMapping("/api/authors")
public class AuthorController {
private final AuthorRepository authors;
private final PostRepository posts;
public AuthorController(AuthorRepository authors, PostRepository posts) {
this.authors = authors;
this.posts = posts;
}
@GetMapping
public List<Dto.AuthorSummary> list() {
return authors.findAllByOrderByNameAsc().stream()
.map(a -> new Dto.AuthorSummary(a.getName(), a.getBio(), a.getPfpLink(),
posts.findByPublishedTrueAndAuthorOrderByPublishedOnDescIdDesc(a.getName()).size()))
.toList();
}
@GetMapping("/{name}")
public Dto.AuthorPage get(@PathVariable String name) {
Author a = authors.findByName(name)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "author not found"));
List<Dto.PostSummary> authored = posts.findByPublishedTrueAndAuthorOrderByPublishedOnDescIdDesc(name)
.stream().map(Dto::summary).toList();
return new Dto.AuthorPage(a.getName(), a.getBio(), a.getXLink(), a.getFbLink(), a.getInstaLink(),
a.getPfpLink(), authored.size(), authored);
}
}
@@ -0,0 +1,56 @@
package net.reformedwitness.cog.web;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import net.reformedwitness.cog.domain.Comment;
import net.reformedwitness.cog.repo.CommentRepository;
@RestController
@RequestMapping("/api/comments")
public class CommentController {
private final CommentRepository comments;
public CommentController(CommentRepository comments) {
this.comments = comments;
}
/** Public list for a post (email is never exposed). */
@GetMapping
public List<Dto.CommentView> list(@RequestParam("postId") String postSlug) {
return comments.findByPostSlugOrderByCreatedAtAsc(postSlug).stream()
.map(c -> new Dto.CommentView(c.getId(), c.getName(), c.getBody(),
c.getCreatedAt() != null ? c.getCreatedAt().toString() : null))
.toList();
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Dto.CommentView create(@RequestBody Dto.CommentRequest req) {
if (blank(req.postId()) || blank(req.name()) || blank(req.email()) || blank(req.comment())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "postId, name, email, comment are required");
}
Comment c = new Comment();
c.setPostSlug(req.postId().trim());
c.setName(req.name().trim());
c.setEmail(req.email().trim());
c.setBody(req.comment().trim());
comments.save(c);
return new Dto.CommentView(c.getId(), c.getName(), c.getBody(),
c.getCreatedAt() != null ? c.getCreatedAt().toString() : null);
}
private static boolean blank(String s) {
return s == null || s.isBlank();
}
}
@@ -0,0 +1,28 @@
package net.reformedwitness.cog.web;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.stereotype.Component;
/** Public site: an authenticated (Authentik) user is treated as an admin. */
@Component
public class CurrentUser {
public boolean isAuthenticated() {
Authentication a = SecurityContextHolder.getContext().getAuthentication();
return a != null && a.isAuthenticated() && !(a instanceof AnonymousAuthenticationToken);
}
public String owner() {
Authentication a = SecurityContextHolder.getContext().getAuthentication();
if (!isAuthenticated() || a == null) {
return null;
}
if (a.getPrincipal() instanceof OidcUser user) {
return user.getPreferredUsername() != null ? user.getPreferredUsername() : user.getSubject();
}
return a.getName();
}
}
@@ -0,0 +1,56 @@
package net.reformedwitness.cog.web;
import java.util.List;
import net.reformedwitness.cog.domain.Post;
/** Request/response shapes for the API. */
public final class Dto {
private Dto() {
}
public record PostSummary(String slug, String title, String date, String excerpt, String author,
List<String> tags, String coverImage) {
}
public record PostDetail(String slug, String title, String date, String excerpt, String author,
List<String> tags, String coverImage, String contentHtml) {
}
public record AuthorSummary(String name, String bio, String pfpLink, int postCount) {
}
public record AuthorPage(String name, String bio, String xLink, String fbLink, String instaLink,
String pfpLink, int postCount, List<PostSummary> posts) {
}
public record CommentView(Long id, String name, String body, String createdAt) {
}
public record TagCount(String tag, long count) {
}
public record CommentRequest(String postId, String name, String email, String comment) {
}
public record SubscribeRequest(String email) {
}
public record MeInfo(boolean authenticated, boolean admin, String owner) {
}
public record PostRequest(String slug, String title, String date, String excerpt, String author,
List<String> tags, String coverImage, String content, Boolean published) {
}
public static PostSummary summary(Post p) {
return new PostSummary(p.getSlug(), p.getTitle(), p.getPublishedOn().toString(), p.getExcerpt(),
p.getAuthor(), List.copyOf(p.getTags()), p.getCoverImage());
}
public static PostDetail detail(Post p) {
return new PostDetail(p.getSlug(), p.getTitle(), p.getPublishedOn().toString(), p.getExcerpt(),
p.getAuthor(), List.copyOf(p.getTags()), p.getCoverImage(), p.getContentHtml());
}
}
@@ -0,0 +1,23 @@
package net.reformedwitness.cog.web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** Public: lets the SPA discover whether the visitor is a logged-in admin. */
@RestController
@RequestMapping("/api/me")
public class MeController {
private final CurrentUser current;
public MeController(CurrentUser current) {
this.current = current;
}
@GetMapping
public Dto.MeInfo me() {
boolean authed = current.isAuthenticated();
return new Dto.MeInfo(authed, authed, current.owner());
}
}
@@ -0,0 +1,47 @@
package net.reformedwitness.cog.web;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import net.reformedwitness.cog.domain.Post;
import net.reformedwitness.cog.repo.PostRepository;
@RestController
@RequestMapping("/api/posts")
public class PostController {
private final PostRepository posts;
public PostController(PostRepository posts) {
this.posts = posts;
}
@GetMapping
public List<Dto.PostSummary> list(@RequestParam(required = false) String tag,
@RequestParam(required = false) String author) {
List<Post> result;
if (tag != null && !tag.isBlank()) {
result = posts.findPublishedByTag(tag);
} else if (author != null && !author.isBlank()) {
result = posts.findByPublishedTrueAndAuthorOrderByPublishedOnDescIdDesc(author);
} else {
result = posts.findByPublishedTrueOrderByPublishedOnDescIdDesc();
}
return result.stream().map(Dto::summary).toList();
}
@GetMapping("/{slug}")
public Dto.PostDetail get(@PathVariable String slug) {
Post p = posts.findBySlug(slug)
.filter(Post::isPublished)
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "post not found"));
return Dto.detail(p);
}
}
@@ -0,0 +1,37 @@
package net.reformedwitness.cog.web;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException;
import net.reformedwitness.cog.domain.Subscription;
import net.reformedwitness.cog.repo.SubscriptionRepository;
@RestController
@RequestMapping("/api/subscriptions")
public class SubscriptionController {
private final SubscriptionRepository subscriptions;
public SubscriptionController(SubscriptionRepository subscriptions) {
this.subscriptions = subscriptions;
}
@PostMapping
public ResponseEntity<Void> subscribe(@RequestBody Dto.SubscribeRequest req) {
if (req.email() == null || req.email().isBlank()) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "email required");
}
String email = req.email().trim().toLowerCase();
if (!subscriptions.existsByEmail(email)) {
Subscription s = new Subscription();
s.setEmail(email);
subscriptions.save(s);
}
return ResponseEntity.status(HttpStatus.CREATED).build();
}
}
@@ -0,0 +1,28 @@
package net.reformedwitness.cog.web;
import java.util.List;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import net.reformedwitness.cog.repo.PostRepository;
@RestController
@RequestMapping("/api/tags")
public class TagController {
private final PostRepository posts;
public TagController(PostRepository posts) {
this.posts = posts;
}
/** All tags used by published posts, with counts. */
@GetMapping
public List<Dto.TagCount> list() {
return posts.tagCounts().stream()
.map(row -> new Dto.TagCount((String) row[0], ((Number) row[1]).longValue()))
.toList();
}
}
+56
View File
@@ -0,0 +1,56 @@
spring:
application:
name: confessions-of-grace
datasource:
url: ${DB_URL:jdbc:postgresql://localhost:5432/confessions_of_grace}
username: ${DB_USER:confessions_of_grace}
password: ${DB_PASSWORD:changeme}
jpa:
hibernate:
ddl-auto: validate
open-in-view: false
flyway:
enabled: true
platform:
web:
spa:
enabled: true
data:
auditing:
enabled: true
storage:
endpoint: ${S3_ENDPOINT:https://s3.thebennett.net}
access-key: ${S3_ACCESS_KEY:}
secret-key: ${S3_SECRET_KEY:}
path-style-access: true
security:
# Public site: everything is readable/commentable/subscribable without login; only /api/admin/** needs
# an Authentik login. mode=OIDC is set in the deploy env (tests default to NONE).
permit-paths:
- /
- /index.html
- /assets/**
- /favicon.ico
- /actuator/health/**
- /api/me
- /api/posts/**
- /api/tags/**
- /api/authors/**
- /api/comments/**
- /api/subscriptions/**
- /api/confession/**
bennett:
storage:
bucket: ${COG_BUCKET:confessions-of-grace}
management:
endpoints:
web:
exposure:
include: health,info
endpoint:
health:
probes:
enabled: true
@@ -0,0 +1,51 @@
create table author (
id bigint generated by default as identity primary key,
name varchar(120) not null unique,
bio text not null default '',
x_link varchar(255),
fb_link varchar(255),
insta_link varchar(255),
pfp_link varchar(255),
created_at timestamptz,
updated_at timestamptz
);
create table post (
id bigint generated by default as identity primary key,
slug varchar(200) not null unique,
title varchar(300) not null,
excerpt text not null default '',
author varchar(120) not null default '',
cover_image varchar(255),
published_on date not null,
content text not null default '', -- raw markdown (body)
content_html text not null default '', -- rendered HTML
published boolean not null default true,
created_at timestamptz,
updated_at timestamptz
);
create index idx_post_pub on post (published, published_on desc);
create table post_tags (
post_id bigint not null references post (id) on delete cascade,
tag varchar(80) not null
);
create index idx_post_tags_post on post_tags (post_id);
create table comment (
id bigint generated by default as identity primary key,
post_slug varchar(200) not null,
name varchar(120) not null,
email varchar(200) not null,
body text not null,
created_at timestamptz,
updated_at timestamptz
);
create index idx_comment_post on comment (post_slug, created_at);
create table subscription (
id bigint generated by default as identity primary key,
email varchar(200) not null unique,
created_at timestamptz,
updated_at timestamptz
);
+64
View File
@@ -0,0 +1,64 @@
---
title: "My Top 25 Books (Outside the Bible) in No Particular Order"
date: "2025-04-22"
author: "Auggie2LBCF"
excerpt: "A curated list of my top 25 books (outside the Bible), spanning theology, Christian living, and even some fiction. These works have deeply shaped my faith, ministry, and personal growth."
tags: ["books", "fiction", "theology", "personal life"]
coverImage: "/images/25-books.png"
---
I'm currently working on a series exploring _The Valley of Vision_ by Arthur Bennett. It's taking longer than most of my usual articles, as I'm aiming for a deeper dive into the theology behind the prayers. In the meantime, I thought it would be fun to share a list of some of my favorite books (outside of the Bible).
# Non-Fiction
## _Confessions_ by Augustine
Augustines _Confessions_ is a raw and powerful testimony of a man transformed by grace. It was my introduction to theology as an adult, thanks to a college church history class that unexpectedly changed my spiritual trajectory. Augustines vulnerability, depth, and insight still resonate deeply.
## _Grace Abounding to the Chief of Sinners_ by John Bunyan
Bunyans autobiographical work grabbed me in a way few books have. His struggle with sin, assurance, and the mercy of God felt incredibly personal and relatable. Its a gripping read that showcases the heart of gospel grace.
## _The Valley of Vision_ by Arthur Bennett
This collection of Puritan prayers was a gift that turned into a spiritual treasure. It showed me the beauty of rich, reverent, and theologically rooted prayer—and has been shaping my devotional life ever since.
## _None Greater_ by Matthew Barrett
I skipped a data structures class to finish this book—it was that compelling. Barretts clear, rich presentation of classical theism opened my eyes to the majesty of God. It also became a gateway for my wife into Reformed theology.
## _Holiness_ by J.C. Ryle
Ryles writing is both pastoral and piercing. _Holiness_ is a wake-up call to pursue godliness with seriousness and joy. Its a book that continues to challenge and encourage me.
## _Algorithms_ by Panos Louridas
It might seem like a curveball on a Reformed blog, but as a software developer, this book speaks to another side of my world. Louridas presents complex ideas clearly and practically—something I really appreciate in both theology and tech.
## _Reformed Preaching_ by Joel Beeke
This book elevated my view of preaching. Beeke beautifully connects the heart of Reformed theology with the soul-stirring purpose of preaching that not only informs but transforms.
## _Gentle and Lowly_ by Dane Ortlund
This book came like a balm. Ortlunds emphasis on the heart of Christ—tender, welcoming, and kind—ministered to my soul in a unique and needed way. Its gospel medicine.
## _Brothers, We Are Not Professionals_ by John Piper
Pipers call to seriousness in ministry and passion for Gods glory has had a deep influence on me. This book reminds me why pastoral ministry is a sacred, soul-shaping calling.
## _Church History_ by Eusebius
Though ancient and sometimes dense, Eusebius provides a fascinating window into the early church. It reminds me that our faith is deeply rooted in real history and real people.
## _Reformed Systematic Theology_ by Joel Beeke & Paul Smalley
This is a theological feast. Its thorough, pastoral, and deeply devotional—a rare combination. I keep coming back to it for insight and encouragement.
## _Building Healthy Churches Series_ by 9Marks
Practical, biblical, and immensely helpful for thinking through church life. This series has sharpened my understanding of the local churchs purpose and structure.
## _True Worship_ by Landon Jones
Worship is often misunderstood or misapplied, but Jones draws us back to its theological roots. This book helped me think more biblically about how and why we worship.
## _The Rare Jewel of Christian Contentment_ by Jeremiah Burroughs
Burroughs offers a timely message for any age. This Puritan classic challenged me to find peace not in circumstance but in Christ.
## _Baptist Symbolics_ by James Renihan
Rich, historical, and careful, this book gave me a deeper appreciation for Baptist confessional theology and its continuity with the broader Reformed tradition.
## _Humility: The Joy of Self-Forgetfulness_ by Gavin Ortlund
A short but soul-searching read. Ortlund helps us see humility not as self-deprecation but as Christ-centered joy.
## _Disciplines of a Godly Man_ by R. Kent Hughes
My dad and I went through this when I first got serious about my faith. It was formative in shaping my understanding of what it means to walk with God as a man.
## _Missions by the Book_ by Alex Kocman & Chad Vegas
This books biblical focus on missions is refreshing and convicting. It cuts through pragmatism and points us back to Scripture as the foundation for global mission work.
## _Missionary Theologian_ by E.D. Burns
Burns bridges theology and missions beautifully. This book challenges us not to separate heart-stirring theology from gospel-driven action.
## _The Art of Man-Fishing_ by Thomas Boston
A short but potent reflection on evangelism. Boston reminds us of the urgency and spiritual depth involved in “fishing for men.”
## _The Case for Christianity_ by Tim Keller
Kellers apologetic work is gentle yet robust. This book helped shape how I approach conversations about faith with skeptics and seekers.
# Fiction
## _Pilgrim's Progress_ by John Bunyan
A timeless Christian allegory, _Pilgrims Progress_ is rich with imagery and theological depth. It laid the foundation for my appreciation of Bunyans other works and continues to offer wisdom for the journey of faith.
## _The Chronicles of Narnia_ by C.S. Lewis
Imaginative and profound, Lewis's Narnia series weaves theology into story so naturally. These tales still stir wonder and reflection, no matter how many times I read them.
## _The Princess Bride_ by William Goldman
This ones just fun. My dad read it to us, and its quirky humor and heart still make it one of my favorite stories. Its a tale of adventure, love, and laughter that never gets old.
## _The Hobbit & The Lord of the Rings_ by J.R.R. Tolkien
Tolkiens epic world-building was part of my childhood, with my dad reading these aloud to us. The stories of courage, loyalty, and hope still hold a special place in my heart—despite the movies not quite living up to the magic of the books!
@@ -0,0 +1,44 @@
---
title: "Review - A Certain Sound by Ryan Denton"
date: "2025-05-09"
author: "Auggie2LBCF"
excerpt: "The title itself, A Certain Sound, draws from 1 Corinthians 14:8, which states, \"For if the trumpet give an uncertain sound, who shall prepare himself to the battle?\""
tags: ["books", "review", "evangelism", "preaching"]
coverImage: "/images/a-certain-sound.jpg"
---
I am an evangelist. From what I can examine in my own heart, and what my family, church, and friends observe, this is true. I am a heavy introvert. I would rather spend my time programming, reading, or playing a video game than having a conversation. But after I came to Christ, I felt a draw towards proclaiming the gospel. As Christians, we are all called to proclaim the gospel, but I possessed a certain boldness that my peers seemed to lack. This is not to say they were less sanctified than I was, or that they were walking in sin, or that they weren't evangelizing at all; rather, they lacked my (often misguided) zeal for seeing others come to Christ. Through Bible study and conversations with mentors, I came to understand that the Holy Spirit had given me the gift of evangelism to encourage the body of Christ. Consequently, I started evangelizing on campus and eventually joined the parachurch organization Cru (formerly Campus Crusade for Christ). At my university, despite some weaknesses in the overall organization, Cru was a reformed ministry with strong ties to the local church. It encouraged me towards evangelism when life was discouraging and motivated me to use my gifts to benefit others. I joined a reformed Baptist church plant and was put on the local outreach team. My pastor then gave me Denton's book _Even If None_, a solid work on Reformed Evangelism. This corrected some of my immature beliefs about what evangelism was and what success in evangelism looked like. A couple of years later, I am now returning to Denton with his book _A Certain Sound: A Primer on Open-Air Preaching_. The title itself, _A Certain Sound_, draws from 1 Corinthians 14:8, which states, "For if the trumpet give an uncertain sound, who shall prepare himself to the battle?"
Denton breaks _A Certain Sound_ into two parts:
1. The Theology of Open-Air Preaching
2. The Task of Open-Air Preaching
Denton's overall goal with the book is to push back against the critics of open-air preaching. Denton recognizes that the image of an open-air preacher in the mind of the Western church is often that of an angry man with a sign yelling about fire and brimstone. Denton wants the church "to see that it can be done, in a proper, biblical way and that this form of preaching has harvested much fruit for the kingdom of God."
# Theology of Open Air Preaching
In the first part of _A Certain Sound_, Denton teaches through:
1. A History of Open-Air Preaching
2. Theology for Open-Air Preaching
3. The Local Church and the Open-Air Preacher
4. Using the Law
5. Using Apologetics
Denton discusses the rich heritage Christians have of open-air preachers, tracing a line from Enoch to Moses, Moses to David, David to Ezra, Ezra to John the Baptist, John the Baptist to Jesus, and Jesus to Paul and Apollos. He continues this lineage to the King of Northumbria sending for Aidan, through the Reformation with figures like John Wycliffe and John Knox, and into the modern period with individuals such as D.L. Moody, Paul Washer, Albert Martin, Cornelius Van Til, and Leonard Ravenhill.
Denton then emphasizes that open-air preaching must be sound in doctrine. He advocates for using the law as a mirror to reveal sin and for starting apologetics with God as the center of everything, asserting that without this foundation,
# The Task of Open Air Preaching
In this second part of *A Certain Sound*, Denton walks through
1. The Preacher's Character
2. The Preacher's Competence
3. Response to Open Air Preaching
4. The Preacher's Response
5. Exhortation to the Church and Seminaries
This second part of _A Certain Sound_ was truly convicting. I recognize that I do not have the "hungering for more holiness" that I ought to. I do not possess the separation from sin, self, and the world that I should. I do not know the Bible as I ought to. I do not respond to hostility as I should. I do not have the prayer life I ought to. This section was a humbling experience for me. I have had my name dragged through the mud for boldly preaching the gospel, but none of those attacks are as damaging to my witness for Christ as my own sin. Denton strongly encourages me to be more like Christ and to surround myself with others who will keep me accountable in pursuing holiness.
# The Church
You'll notice that I omitted discussion of the chapters about the church from part one and part two earlier. I wanted to address these together because I believe Denton does a remarkable job of balancing two truths: the need to hold the church in high esteem while simultaneously recognizing that hostility to the preached gospel can sometimes come from other believers. I have lost long-term friends because they believed I was "damaging the gospel" with my bold proclamation. Conversely, I have also been blessed with a pastor who champions my efforts to go into the world and make disciples of all nations. Denton exhorts churches and seminaries to teach open-air preaching and to encourage their pastors and members to go into the streets and proclaim, "Repent, for the kingdom of heaven is at hand."
[A Certain Sound](https://heritagebooks.org/products/a-certain-sound-a-primer-on-open-air-preaching-denton-smith.html)
[Even if None](https://www.firstloveministries.org/product/even-if-none-reclaiming-biblical-evangelism/)
@@ -0,0 +1,88 @@
---
title: "Against Ethnocentric Christian Nationalism"
date: "2025-04-05"
author: "Auggie2LBCF"
excerpt: "While Christian principles have historically informed public life within Reformed traditions, Reformed theology itself, grounded in doctrines like the Imago Dei, the universal scope of redemption, and the nature of the Church, stands in opposition to ethnocentric expressions of Christian Nationalism."
tags: ["christianity", "nationalism", "theology", "ethics", "identity", "political philosophy", "church and state"]
coverImage: "/images/templar.jpeg"
---
# Introduction
The term "Christian Nationalism" evokes a wide range of responses and interpretations in contemporary discourse. Often intertwined with discussions of national identity, cultural heritage, and political action, it raises significant theological questions for Christians seeking to understand their faith's relationship to the public square and national life. This paper aims to examine the concept of Christian Nationalism, particularly when fused with ethnocentrism, through the lens of Reformed theology. By first defining key terms—"Christian," "Christian Nationalism," and "Ethnocentric"—we can establish a clear framework. Subsequently, an analysis based on systematic and historical Reformed theology will explore the compatibility, or lack thereof, between the core tenets of the Reformed faith and an ethnocentric vision of national identity and purpose pursued under the banner of Christianity. The central argument is that while Christian principles have historically informed public life within Reformed traditions, Reformed theology itself, grounded in doctrines like the Imago Dei, the universal scope of redemption, and the nature of the Church, stands in opposition to ethnocentric expressions of Christian Nationalism.
# Definitions
I will start by defining what exactly I mean by each of the words in the title. This is to prevent any confusion with my position and to help see what I am seeing.
## Christian
With where society is at with Christianity, it will be helpful to fence what I mean by Christian. Here are 5 points that I would use when describing a Christian, rooted in a Reformed understanding of salvation:
1. Those who have been regenerated with an effectual call. They have been given a new heart and spiritual life (John 3:3), drawing them irresistibly to Christ (2 Timothy 1:9). This is a sovereign work of God initiating salvation.
2. Those who have a saving faith. A wholehearted trust and reliance solely upon Jesus Christ for salvation (Ephesians 2:8-9). This faith itself is understood as a gift from God (Westminster Shorter Catechism Q. 86).
3. Those who have repentance unto life. Saving faith is always accompanied by repentance—a heartfelt sorrow for sin, a turning away from it, and a sincere turning towards God and His commands (Acts 20:21), recognized, again, as a grace from God.
4. Those who have been justified. The believer has been declared righteous by God, not based on their own merits but solely based on Christ's righteousness being imputed (credited) to them through faith (Romans 3:24-25a, Heidelberg Catechism Q. 60).
5. Those who have union with Christ. The believer is spiritually united with Christ (2 Corinthians 5:17), partaking in His death and resurrection, and adopted into God's family as His child, becoming an heir with Christ (Romans 8:17).
When I refer to Christian, I am referring to individuals defined by these theological realities, encompassing a broad spectrum within orthodox Protestantism who affirm these core tenets, regardless of specific denominational distinctives like those separating, for example, Reformed Baptists (like Sam Waldron) from others within conservative evangelicalism (like Mike Winger) who share these soteriological foundations. The emphasis is on the spiritual realities wrought by God's grace, not primarily on cultural or national identity.
## Christian Nationalism
Christian nationalism is a totality of national action, consisting of civil laws and social customs, conducted by a Christian nation as a Christian nation, in order to procure for itself both earthly and heavenly good in Christ. (The Case for Christian Nationalism, Stephen Wolfe, p. 9)
This definition posits the nation itself acting as Christian to achieve specific temporal and eternal ends through its collective civil and social structure.
## Ethnocentric
Ethnocentric is the evaluation of other cultures according to preconceptions originating in the standards and customs of one's own culture. Often, this involves an attitude of inherent superiority of one's own ethnic group or culture. In the context of this paper, ethnocentric Christian nationalism would imply that the "Christian nation" envisioned is tied explicitly or implicitly to a specific dominant ethnic group, viewing its cultural norms and heritage as normative or superior, and potentially seeking to preserve or promote this ethnic identity as integral to the nation's "Christian" character.
# Systematic Theology
Systematic theology provides foundational doctrines that inform a Christian worldview, including perspectives on humanity, culture, and governance. Several key doctrines are relevant:
## Theology Proper (Doctrine of God):
God is the sovereign Creator and Ruler over all nations (Psalm 22:28, Daniel 4:34-35). His ultimate allegiance is to His own glory and His universal redemptive plan, not to any single nation or ethnic group. While He works through nations in history, no single earthly nation equates to His chosen people in the way Old Testament Israel did.
## Anthropology (Doctrine of Man):
### Imago Dei: Genesis 1:26-27 states:
"Then God said, 'Let us make man in our image, after our likeness. And let them have dominion over the fish of the sea and over the birds of the heavens and over the livestock and over all the earth and over every creeping thing that creeps on the earth.' So God created man in his own image, in the image of God he created him; male and female he created them." This foundational doctrine asserts the inherent dignity, value, and equality of all human beings, regardless of ethnicity, nationality, or culture, because all bear God's image. Ethnocentrism, which elevates one group over others, fundamentally contradicts the universal application of the Imago Dei.
### Unity of Humanity:
Acts 17:26 affirms that God "made from one man every nation of mankind to live on all the face of the earth, having determined allotted periods and the boundaries of their dwelling place." This underscores the common origin and essential unity of the human race, militating against ideologies that promote ethnic division or superiority.
### The Fall and Sin:
Sin has fractured human relationships, leading to pride, prejudice, hostility, and the idolization of created things, including one's own ethnic group or nation (Romans 1:21-25). Ethnocentrism can be understood as a manifestation of this fallen human tendency.
## Soteriology (Doctrine of Salvation) & Ecclesiology (Doctrine of the Church):
### Universal Scope of Redemption:
Christ's redemptive work is intended for people "from every tribe and language and people and nation" (Revelation 5:9). The Gospel call is universal (Matthew 28:19).
### The Nature of the Church:
The Church, the body of Christ, is by definition a multi-ethnic, transnational entity. Galatians 3:28 famously states: "There is neither Jew nor Greek, there is neither slave nor free, there is no male and female, for you are all one in Christ Jesus." Ephesians 2:14-16 speaks of Christ breaking down the "dividing wall of hostility" between Jew and Gentile, creating "one new man." Christian identity, as defined earlier (regeneration, faith, repentance, justification, union with Christ), transcends and relativizes all earthly distinctions, including ethnicity and nationality. The primary identity of the Christian is "in Christ," not defined by ethnic or national origin.
## Eschatology (Doctrine of Last Things):
The ultimate vision of God's consummated kingdom is one of diversity in unity, with redeemed people from all nations worshipping God together (Revelation 7:9-10). This future reality informs the present mission and nature of the Church, countering any ethnically or nationally exclusive vision.
Systematically, Reformed theology emphasizes the universal reach of God's sovereignty, the equal dignity of all image-bearers, the divisive nature of sin (including ethnic pride), the multi-ethnic composition of Christ's Church, and the global scope of God's redemptive plan. These doctrines create significant theological tension with any ideology that prioritizes one ethnic group or fuses Christian identity inextricably with a particular national or ethnic heritage.
# Historical Theology
The historical witness of Reformed theology further complicates and often directly challenges ethnocentric forms of Christian Nationalism:
## 1. The Two Kingdoms Theology
Reformed theologians such as John Calvin, Martin Luther (though Lutheran, influential), and later Abraham Kuyper developed or supported variations of "Two Kingdoms Theology." The idea is that God governs the world in two distinct ways:
* The spiritual kingdom: Governed by the church through the Word and sacraments, focused on salvation and spiritual life.
* The civil kingdom: Governed by the magistrate, responsible for earthly justice, order, and societal well-being for all citizens. This distinction inherently limits the state's role in spiritual matters and the church's role in wielding civil power. While the civil kingdom is to uphold God's moral law (natural law), its mandate is temporal justice and peace, not enforcing regeneration or exclusively promoting the "heavenly good" of one eth nic group as the state's primary function. The Westminster Confession of Faith (Chapter 23) outlines the magistrate's duties in maintaining piety, justice, and peace, but cautions against undue interference between church and state. Ethnocentric policies would violate the principle of common justice for all under the civil kingdom's care.
## 2. Magisterial Views on Church and State
The early Reformers, including Calvin, viewed the state as ordained by God to uphold righteousness. Calvin's Geneva aimed for a society governed by Christian principles, yet his focus was on submission to God's moral law for public order, not on establishing an ethnically defined state. His theology affirmed God's sovereignty over all nations. The goal was a godly commonwealth ordered by divine precepts applicable broadly, not the exaltation of a specific ethnicity as inherently chosen or superior within the civil structure.
## 3. Covenant Theology
Reformed theologians have most often interpreted Christian identity through covenant theology, emphasizing the global and multi-ethnic nature of God's redemptive plan inaugurated through Abraham but fulfilled in Christ. God's promise extends to all nations through Christ (Genesis 12:3, Galatians 3:8, 2829). This fundamentally undercuts theological justifications for ethnocentric nationalism, as belonging to the covenant community is determined by faith in Christ, not ethnicity. Figures like Herman Bavinck powerfully articulated the catholicity (universality) of the Church, stressing that Christ's salvation breaks down all barriers of ethnicity and nationality.
## 4. Warnings Against Idolatry
Reformed theology strongly warns against idolatry—giving ultimate allegiance or devotion to anything other than God. This includes the state or one's own ethnic/cultural identity. Drawing from Augustine's City of God, Reformed thought distinguishes the eternal City of God (the Church, spiritually defined) from the temporal City of Man (earthly governments and societies). Ethnocentric nationalism risks committing idolatry by elevating the nation or ethnic group to a position of ultimate significance, potentially conflating its temporal well-being and cultural preservation with the Kingdom of God.
## 5. Abraham Kuyper and Sphere Sovereignty
Abraham Kuyper argued for "sphere sovereignty," positing that God ordained distinct spheres of life (family, church, state, arts, etc.), each with its own God-given authority and responsibility, directly under Christ's lordship. The state's role is limited and should not dominate other spheres, particularly the church. While Kuyper championed Christian influence across all spheres, his framework promoted a principled pluralism where the state protects the freedom of various groups (including religious ones) rather than enforcing a single ethno-religious identity. His vision was for Christian principles to inform public life organically, not through state coercion that merges national identity with a specific ethnic or singular Christian expression.
## 6. Historical Critique of Nationalism
Especially following the rise of modern nationalism, many Reformed theologians have critiqued its dangers, particularly its ethnocentric and idolatrous potential. The universal nature of the Church and the primary allegiance owed to Christ stand in tension with nationalist ideologies demanding ultimate loyalty. Figures like J. Gresham Machen and Carl F.H. Henry warned against conflating the Christian faith with specific political or national agendas, emphasizing the Gospel's transcendence over temporal, national, or ethnic interests. They stressed that the Church's mission is spiritual and universal, distinct from the political aims of any nation-state.
# Conclusion
Examining Christian Nationalism, especially when infused with ethnocentrism, through the dual lenses of systematic and historical Reformed theology reveals significant points of friction. Systematically, core doctrines such as the Imago Dei applied universally, the unity of humanity, the multi-ethnic nature of the Church defined by grace through faith, and the universal scope of God's redemptive plan stand against ideologies that elevate one ethnic group above others or inextricably link Christian identity to a specific ethnicity or nationality.
Historically, while Reformed thinkers affirmed the state's God-ordained role in upholding justice and order, concepts like the Two Kingdoms, sphere sovereignty, covenant theology's emphasis on the universal church, and stern warnings against idolatry have consistently served to distinguish the spiritual kingdom of Christ from temporal, earthly kingdoms. They caution against conflating the Church's mission with nationalistic ambitions and resist granting ultimate significance to national or ethnic identity.
Therefore, while Christians, informed by their faith, should engage responsibly in the public square and seek the common good, an ethnocentric Christian Nationalism appears theologically unsustainable from a Reformed perspective. It risks violating the inherent dignity of all image-bearers, undermining the unity and universality of Christ's Church, and potentially falling into the idolatry of nation or ethnicity. True Christian identity, according to Reformed teaching, is found not in blood or soil, but in the regenerating grace of God through faith in Jesus Christ, uniting believers from every tribe, tongue, people, and nation into one body.
+40
View File
@@ -0,0 +1,40 @@
---
title: "Frank Turek & The Fourfold State of Man"
date: "2025-03-18"
author: "Auggie2LBCF"
excerpt: "The 'contradiction' that Geisler suggests, is not a contradiction but an incomplete understanding of the abilities of Adam, the abilities of Adam's offspring, and the abilities of those who receive God's abundant provision of grace, who are given the responsibility to freely offer that abundant provision of grace to all those who are Adam's offspring."
tags: ["sin", "calvinism", "creation", "fourfold"]
coverImage: "/images/thomas-boston.jpg"
---
If you are looking for a definitive answer to the question "Where did Sin Come From?" please press the "close tab" button, it is usually marked with an "x" on your browser or perhaps you are on a phone and need to hit the little box first. Either way the origin of sin is not clearly presented in the Bible.
I was scrolling throu[]()gh Instagram Reels one day (also known by other names such as "a bad idea" and "a waste of time") and happened on a [video by Frank Turek](https://youtube.com/shorts/qdiW5dtOkgo?si=YuiUgg5uZwkzcuD3). In it he is doing a form of Q&A at what looks to be a university. And what it said really took me off guard and made me think (which rarely happens when scrolling through any short video platform). Here is the transcript of that video:
> **Q:** "My in-laws are Calvinist. I want to know what the main out of the Five Points, what is the main thing that's, for like of a better term, wrong what's wrong about Calvinism?"
>
> **Frank Turek:** "See, the ultimate problem with Calvinism, hard five point Calvinism in my view, is it makes the world a sham. Because we really don't have a free choice, but God is telling us that we ought to choose him when we can't choose him because he hasn't chosen us at all. And secondly, it makes God the author of evil. In fact, let me give you an example. In a debate that took place 40 years ago at Dallas Theological Seminary, it was between Norman Geisler, my mentor, and a guy by name of John Gerstner. At one point, Geisler turned to Gerstner and he said, 'Does man have free will?' And Gerstner said, 'Yes, man has free will to do what he desires, but God gives him the desire of his heart.' So Geisler said, 'Who gave Adam the desire to sin?' and Gerstner said, 'Mystery.' And Geisler said, 'Contradiction.'"
The debate that Turek mentions is not recorded anywhere but in Geisler's book *Chosen But Free*.
> Many years ago when the late John Gerstner and I taught together at the same institution, I invited him into one of my classes to discuss free will. Being what I have called an extreme Calvinist, he defended Jonathan Edwards' view that the human will is moved by the strongest desire. I will never forget how he responded when I pushed the logic all the way back to Lucifer. I was stunned to hear an otherwise very rational man respond to my question "Who gave Lucifer the desire to rebel against God?" by throwing up his hands and crying, "Mystery, mystery, a great mystery!" I answered, "No, it is not a great mystery; it is a grave contradiction." And this is because, on the premises of extreme Calvinism, only God could have given Lucifer the desire to rebel against God, since there is no self-determined free choice and Lucifer had no evil nature. But if this is so, then logically it must have been God who gave him the desire to sin. In short, God caused a rebellion against God! Perish the thought!
The debate that Turek and Geisler mention is presented as a "gotcha" moment that completely and utterly destroys all arguments for Calvinism and should shut up the Cage-Stagers. Cage-Stagers is a term which here means: a person who should be locked in a cage until they can have a civil conversation about Calvinism. However, this is missing the response. And as I have yet to be able to find the response that Gerstner gives, I will write one here. *The "contradiction" that Geisler suggests, is not a contradiction but an incomplete understanding of the abilities of Adam, the abilities of Adam's offspring, and the abilities of those who receive God's abundant provision of grace, who are given the responsibility to freely offer that abundant provision of grace to all those who are Adam's offspring.*
Abilities is a word which, in the murky and complicated world of theological discourse, refers to a peculiar and somewhat precarious collection of potential actions, much like a rickety ladder balanced precariously over the deep and treacherous chasm of human limitation—in this case, specifically applying to Adam and Eve in their initial state, mankind after their unfortunate fall from grace, believers, and those who have already departed to be with the lord. Thomas Boston refers to these as the fourfold state of man.
### 1. Man Created (*status integritiatis*) or Primitive Integrity
Man was created in a state of innocence. "This only have I found: God created mankind upright, but they have gone in search of many schemes." (Ecclesiastes 7:29). However, Adam also ate the apple and fell from this upright position, thus cursing all of man. "Therefore, just as sin entered the world through one man, and death through sin, and in this way death came to all people, because all sinned." (Romans 5:12). From these passages we can see that God created Adam with the ability to do upright actions, but with the inclusion of Romans 5:12, we can see that Adam was able to not sin, being upright, or able to sin. Augustine refers to this as *posse peccare, posse non peccare*.
### 2. Man Fallen (*status corruptionis*) or Entire Depravity
From Adam's sin, death came to all people (Romans 5:12). Each one of us as Adam's offspring are cursed with this death. "As for you, you were dead in your transgressions and sins... All of us also lived among them at one time, gratifying the cravings of our flesh... and were by nature deserving of wrath." (Ephesians 2:1-3). We are dead in our transgressions. We are from birth children of wrath who seek only to gratify the cravings of our flesh. We are unable not to sin (*non posse non peccare*). Regardless of how our actions look to other men, the Bible is clear: "None is righteous, no, not one; no one understands; no one seeks for God. All have turned aside; together they have become worthless; no one does good, not even one." (Rom. 3:10-12). No one does good.
### 3. Man Redeemed (*status gratiae*) or Begun Recovery
However, in God's curse to Adam and Eve, he also gave them hope for their salvation in the one who would crush the serpent's head. Noah's father Lamech was hoping for the "one who would bring relief" (Genesis 5:29). The one who would bring relief was Christ, who, through his work on Calvary, took the cup of wrath that all deserve and bought his people (1 Corinthians 7:23) into a new creation where we have the ability to not sin (*posse non peccare*). "Therefore, if anyone is in Christ, the new creation has come: The old has gone, the new is here!" (2 Corinthians 5:17).
### 4. Man Glorified (*status gloriae*) or Consummate Happiness or Misery
However, we still sin. "Not only so, but we ourselves, who have the first fruits of the Spirit, groan inwardly as we wait eagerly for our adoption to sonship, the redemption of our bodies." (Romans 8:23). We will not be fully transformed until we are in Heaven: "we will transform our lowly bodies so that they will be like his glorious body." (Philippians 3:21).
So, Turek and Geisler misunderstand that Adam was not cursed in the way that we are. All of our desires are for the cravings of our flesh. Calvinism does not teach that God is the author of evil. The Bible teaches that our hearts are worthless and need the Holy Spirit to save us: "he saved us, not because of works done by us in righteousness, but according to his own mercy, by the washing of regeneration and renewal of the Holy Spirit" (Titus 3:5).
As to Turek's claim that "God is telling us that we ought to choose him when we can't choose him because he hasn't chosen us," he is missing that anyone who wants to choose God will be able to choose him. The Holy Spirit must renew us. It is not a work of our righteousness to choose God but the regeneration of the Holy Spirit through the proclamation of the Gospel.
@@ -0,0 +1,74 @@
---
title: "The Eternity of Our Bodies"
date: "2025-08-15"
author: "Auggie2LBCF"
excerpt: "A curated list of my top 25 books (outside the Bible), spanning theology, Christian living, and even some fiction. These works have deeply shaped my faith, ministry, and personal growth."
tags: ["2lbcf", "anthropoloy", "theology", "personal life"]
coverImage: "/images/the-eternity-of-our-bodies.jpg"
---
# Introduction
Ever feel like your body is letting you down?
Its the ache in your lower back thats become your new normal. Its the flickering anxiety when you look in the mirror, comparing your reality to the curated perfection on your screen. It's the chronic diagnosis, the creeping fatigue, the simple, frustrating fact that you are getting older. We live in a world that repeatedly tells that our bodies are temporary, disposable shells for our "real" selves. At best, they are projects to be perfected; at worst, they are prisons to one day escape.
This idea has deep roots. The ancient Greek philosopher Plato taught that the physical world was a shadowy imitation of the perfect spiritual realm. This thinking seeped into a worldview called Gnosticism, which saw the body as an evil cage for the pure, spiritual soul. While we might not use those labels today, that core idea is everywhere. Its in our obsession with "digital life" over embodied presence and in our quiet assumption that heaven is about leaving this world behind. But thats more Plato than Paul.
The biblical story offers a far more robust, more beautiful, and frankly, more startling hope. It's a hope thats earthy, tangible, and real. Get this: God does not plan to replace your body, but to resurrect and glorify it.
He doesn't scrap His original design; He perfects it. He doesn't look at His creation and call it a failed experiment; He promises to redeem it completely.
This isnt some new, trendy idea. This is the firm and comforting ground upon which Christians, including Reformed Baptists, have always stood. Its a hope built on the bedrock of Scripture and articulated with beautiful clarity in the Second London Baptist Confession. Its a truth that has the power not only to shape your future hope but to transform your present life.
So let's unpack it.
# Biblical Foundation
When you want to go deep on the resurrection body, Pauls first letter to the Corinthian church is ground zero. In chapter 15, he uses an agricultural analogy to explain this mystery. A farmer plants a tiny, unimpressive seed in the ground. Later, a tall, golden stalk of wheat shoots up, waving in the sun. The stalk isn't a new plant; it's the full, glorious maturation of that very seed. There's both continuity (it's still wheat) and discontinuity (it looks, feels, and functions in a vastly different way). Paul applies this directly to us. He repeats the rhythmic phrase, "It is sown... it is raised," to show that the same body that is sown in perishability, dishonor, and weakness will be raised in imperishability, glory, and power. Its a radical transformation, not a replacement.
Paul clarifies that we will be given a "spiritual body." Now, our modern ears hear that and think "non-physical ghost." But thats not what he means. A "natural body" is one inhibited by our fallen human nature, subject to decay and death. A "spiritual body," then, is a physical body perfectly and completely transformed by the Holy Spirit. Its a body freed from sin, sickness, and death, fit for eternity. This idea of transformation is echoed in Philippians 3:21, where Paul says the Lord Jesus Christ "will transform our lowly body to be like his glorious body." The key word is transform. Hes not getting rid of it; Hes upgrading it.
And the pattern, the ultimate proof for this upgrade, is Jesus Himself. His resurrection is the "first fruits," the prototype that guarantees the rest of the harvest. Think about the accounts. The disciples were huddled in a locked room, terrified. They weren't expecting a physical resurrection. When Jesus appeared, they thought He was a ghost. But what did He do? He showed them His hands and His side. He invited Thomas to touch His wounds. He still had a physical body with "flesh and bones" that bore the very marks of His crucifixion. He wasn't a spirit or a phantom; He even sat down and ate broiled fish to prove His physicality. This shows us, in the most concrete way possible, that the resurrected body is the selfsame body, gloriously remade.
This thread of bodily importance runs all through Scripture. In Romans 8, Paul connects our future hope directly to our present reality, stating, "He who raised Christ Jesus from the dead will also give life to your mortal bodies through his Spirit who dwells in you." The same Spirit that lives in us now is Gods down payment on our future resurrection. The hope is for everyone, as Acts 24:15 teaches that "all will be raised on the last day, 'both of the just and unjust.'" Our bodies are so significant that even now, they are called the "temple of the Holy Spirit" and are to be used as instruments for righteousness. Why? Because God's plan has always been physical. In the beginning, He declared His physical creation, including our bodies, "very good." And in the end, our hope is not to float on a cloud in a disembodied state but to live in glorified bodies in a "New Heavens and a New Earth," a restored and perfected creation. God's plan is to redeem and restore His original project, not to abandon it.
Confessional Clarity
This profound biblical truth isn't just for scholars to debate; it's a core conviction the church has confessed for centuries. The Second London Baptist Confession of 1689 puts it with stunning clarity and force, stating that on the last day, "all the dead shall be raised up with the selfsame bodies, and none other; although with different qualities." Let that phrase sink in: "the selfsame bodies, and none other." This isn't a trade-in for a new model or a spiritual copy. The confession hammers home the point of personal, physical continuity. The body laid in the grave is the very same body that will be raised in glory, different only in its quality, not its fundamental identity.
Why was this so important? The writers of the confession weren't working in a vacuum. They were drawing a clear line in the sand against heresies that had plagued the church for ages, firmly establishing themselves with the Presbyterians in Orthodoxy. For God's final judgment to be truly just, the very same person who lived, sinned, and (for the believer) was redeemed must stand before Him. That requires the whole person, body and soul reunited. This conviction rejected the ideas of groups like the Socinians and Quakers, who tried to spiritualize or deny the bodily resurrection. This historic position stands as a bulwark against ancient Gnostic heresies that devalued the physical world and even modern errors like those of Jehovah's Witnesses. This affirmation of the body is a consistent theme from the early church fathers like Irenaeus and Augustine, through Reformation giants like John Calvin, who wrote, "The resurrection is no abolition but a restoration of the body," and on to Puritan theologians like John Owen, who argued powerfully that the reunion of the soul with the same body is essential for Gods justice and our eternal reward.
# Theology Implications
First, this doctrine honors God's creation. The resurrection is God's final, triumphant stamp of approval on the physical world He made and called "very good." It demolishes any dualistic idea that the spiritual is good and the physical is bad. Instead, it shows us a God who is committed to redeeming and perfecting His entire creative work, from mountains and rivers to our own physical bodies. This should shape how we see the world, fostering a sense of stewardship and care for a creation that is not disposable but destined for renewal.
Second, it gives profound dignity to our present bodies. Because this body is destined for glorification, its not a disposable container. It is the very "temple of the Holy Spirit" and an instrument for righteousness. This has massive implications for how we live. How we care for our bodies now, including our health, our purity, our rest, and our service, has eternal significance. We are living in the prototypes of what will one day be raised in glory. We can practice this by embracing rhythms of rest like the Sabbath, honoring our physical limits. We can practice it by eating with gratitude, turning meals into moments of fellowship instead of hurried refueling. We can even practice it through the physical postures of worship, like kneeling in prayer or raising our hands in praise, reminding ourselves that our faith is an embodied one.
This truth also provides immense comfort in grief. The graveside is a place of profound pain because we are saying goodbye to a physical person. Our hope is not that we will merely meet a disembodied soul one day, but that God will raise that very person, with soul and body reunited in power and glory. The person you knew and loved, with their unique laugh and the familiar shape of their hands, will be recognizable and whole in their glorified state. Death is a brutal enemy, but it is not the end of the story.
Furthermore, this truth fuels our evangelistic hope. The gospel we offer to a broken world is not an ethereal escape plan. It's the good news of a comprehensive redemption for the whole person, body and soul, for a physical and glorious eternity in the New Heavens and New Earth. In a world offering flimsy hopes like digital immortality or nihilistic despair, we proclaim a Savior who doesn't just save souls; He redeems people in their entirety.
Ultimately, this gets to the heart of what it means to be a human person. God made us as a beautiful unity of physical and spiritual aspects, as seen from the very beginning in Genesis 2:7. Salvation and sanctification are for the whole person. This is why the incarnation of Christ is so critical; God took on flesh to redeem us in the flesh. Christs resurrection confirms the future resurrection of our bodies, redeeming and restoring both our physical and spiritual natures. When God made humanity in His "image and likeness," He was speaking of the whole person, a unified being created for relationship with Him. This view grounds the intrinsic worth of every human life, from conception onward, and gives us a deep and abiding hope for our complete restoration in Christ.
# Conclusion
So, what do we do with all of this? How does this ancient doctrine intersect with your life on a busy Tuesday afternoon?
This truth isn't just for theology textbooks or a debate club. It's meant to get into your bones, to reshape how you see yourself, your struggles, and your future. Its a truth to be lived.
It means that your chronic illness does not have the final say. It means that the aging process is not a slow march into oblivion. It means that death does not get the last word.
The empty tomb of Jesus isn't just a historical fact; it's a promise. It's the down payment on your own resurrection. Because He was raised, we who are in Him will be raised. His resurrected body, physical enough to eat fish and be touched by his friends, is the living, breathing blueprint for our own.
This is our hope. And it changes everything.
Our hope is not in an escape from the world, but in its glorious renewal. Our mission, then, is to live as citizens of that coming reality, right here, right now, in these very bodies. How would you live differently this week if you truly believed your body was a temple destined for glory?
Treat your body with dignity. It is not an enemy to be punished or an idol to be perfected, but a gift to be stewarded for the glory of God. Practice rhythms of rest and worship.
Comfort those who grieve with this concrete, physical hope: we will see them again. Not as wispy spirits, but as whole people, remade in the image of the glorious Christ.
And share this good news with a world that is aching for a hope that is real, tangible, and strong enough to conquer the grave. A hope that redeems the whole person.
Body. And. Soul.
Your future is not a ghost. It's a glorified body on a renewed earth with a resurrected King.
@@ -0,0 +1,126 @@
---
title: "Valley of Vision - Part 1: Adoration"
date: "2025-05-13"
author: "Auggie2LBCF"
excerpt: "I must reverently adore God, as a Being transcendently bright and blessed, self-existent and self-sufficient, an infinite and eternal Spirit who has all perfections in himself, and give him the glory of his titles and attributes."
tags: ["the valley of vision", "prayer", "puritans", "adoration"]
coverImage: "/images/valley-of-vision.png"
---
## Series Introduction
The Valley of Vision, edited by Arthur Bennett and published in 1975, is a compilation of Puritan prayers and devotions.
Bennett intended it not as a static manual, but as a catalyst for active communion with God,
emphasizing that prayer is learned through practice. This deep engagement involves adoration and dedication,
with the collected prayers designed as "aspiration units" to inspire the reader's own communication with God.
This analysis will explore The Valley of Vision through the structural lens provided by Matthew Henrys work,
*A Method for Prayer*. Henry's framework organizes prayer into Adoration, Confession, Thanksgiving, Petition, and Intercession.
Using this method, the series will examine the devotional content within The Valley of Vision.
This initial installment begins the five-part series by focusing specifically on the theology of Adoration expressed in the collection.
## Introduction - Adoration
*I must reverently adore God, as a Being transcendently bright and blessed, self-existent and self-sufficient, an infinite and eternal Spirit who has all perfections in himself, and give him the glory of his titles and attributes.*
**- A Method for Prayer**
Adoration serves as the crucial starting point for both The Valley of Vision's collection of prayers and Matthew Henry's A Method for Prayer.
Think of it this way: true prayer is fundamentally about entering into the presence of God. Before we bring our needs, our failures, or our thanks, we must first acknowledge who it is we are approaching. Adoration is the act of focusing our minds and hearts entirely upon God Himself His character, His attributes, His transcendent glory, His perfect holiness, His infinite power, His unchanging faithfulness, His sovereign love, His boundless mercy. It is praising God simply because He is God, and He is worthy of all praise.
1. Setting the Proper Perspective: Starting with adoration immediately shifts the focus from ourselves our problems, our desires, our spiritual state to the triune God who exists in perfect self-sufficiency and glory. This is crucial because it correctly orders our relationship with the divine. Prayer isn't a transaction where we list demands; it's communion with the Creator and Redeemer. Beginning with His majesty cultivates humility and reverence, acknowledging that we are but dust before the eternal King (Psalm 8:3-4, Isaiah 6:1-5). Both The Valley of Vision and Henry's method implicitly (through the content of the prayers) and explicitly (through the structure) train the believer to adopt this God-centered posture from the outset.
2. Grounding Other Aspects of Prayer: Adoration provides the necessary foundation for all subsequent elements of prayer:
* We confess our sins in light of His absolute holiness and perfect standard. Without first adoring His purity, our confession might be merely regret for consequences rather than true repentance born from seeing our sin against Him.
* We give thanks because of His inherent goodness and the specific mercies that flow from His nature. Our gratitude is rooted in His character, not just our temporary circumstances.
* We make petitions with faith and submission because of His power to act, His wisdom to know what is best, His promises to His people, and His sovereign will. Adoration reminds us that we pray to one who is able to do "far more abundantly than all that we ask or think" (Ephesians 3:20), yet also one whose plans are perfect.
* We intercede for others knowing that the God we adore is merciful and powerful to save and sustain.
3. Reflecting God's Supreme Worth: At the heart of Reformed theology is the conviction that God's glory is the ultimate end of all things, including His creation, redemption, and providence. Man's chief end is to glorify God and enjoy Him forever. Adoration is the most direct expression of glorifying God in prayer. By starting here, both The Valley of Vision and Henry reinforce the fundamental truth that God is worthy of worship simply for who He is, and that acknowledging His worthiness is the most fitting way to begin any approach to Him. The Puritan prayers in The Valley of Vision beautifully demonstrate this, often dwelling on God's attributes before moving to personal needs. Henry's method provides a map for the mind and soul to follow this theologically sound path.
In essence, adoration is the "crucial starting point" because it correctly aligns the worshiper with the One being worshiped. It ensures that prayer flows from a right understanding of God's character and our place before Him, preventing it from becoming a self-focused exercise and rooting it firmly in the awe-inspiring reality of who our great God is. It is stepping onto holy ground before presuming to speak further.
## Valley Of Vision
### Themes of Adoration
In its prayers, the Valley of Vision acknowledges God in profound and heartfelt ways, often emphasizing His greatness, holiness, sovereignty, and mercy. The prayers reflect a deep understanding of God's transcendence and immanence, with an intimate, personal tone toward the Creator. Here are some key ways in which *The Valley of Vision* acknowledges God:
1. **God's Sovereignty and Majesty**:\
Many of the prayers in *The Valley of Vision* emphasize God as the sovereign ruler of the universe. Psalm 103:19 declares it, and so do the puritans. He is acknowledged as having supreme authority over all creation. The prayers express awe and reverence for God's power and control over every aspect of life.
> "I enter thy presence, worshipping thee with godly fear,
> awed by thy majesty, greatness, glory,
> but encouraged by thy love."
>
> **Meeting God**
2. **God's Holiness and Purity**:\
The prayers often emphasize God's perfect holiness, His utter separation from sin, and His moral purity. This serves to highlight human sinfulness in contrast, prompting the prayerful response of confession, repentance, and petition.
> "Enable us to remember what thou art and what we are,
> to recall thy holiness and our unworthiness;"
>
> **Seventh Day Morning**
3. **God's Mercy and Grace**:\
The theme of God's mercy and grace is central in these prayers. The Puritans frequently acknowledge God's lovingkindness in forgiving sinners and in offering grace despite human shortcomings.
> "In spite of the number and heinousness of my sins
> thou hast given me a token for good;
> The golden sceptre is held out,
> and thou hast said Touch it and live."
>
> **Mercy**
4. **Personal Relationship with God**:\
While acknowledging God's transcendence and majesty, many of the prayers express a deep, personal connection with Him. The Puritans often pray to God as a Father, Shepherd, and Savior, demonstrating an intimate relationship.
> "When thou art present, evil cannot abide;
> In thy fellowship is fullness of joy,"
>
> **The Great God**
5. **Acknowledging God's Work in Salvation**:\
The prayers in *The Valley of Vision* reflect a deep understanding of salvation as a work of God alone. They acknowledge the need for Christ's sacrifice and the Spirit's work in renewing and sustaining faith.
> "I bless thee that thou hast made me capable
> of knowing thee, the author of all being,
> of resembling thee, the perfection of all excellency,
> of enjoying thee, the source of all happiness."
>
> **God Enjoyed**
### Glory
The Valley of Vision doesnt merely present adoration as abstract reverence—it renders it doxological. Adoration in these prayers naturally moves toward the glorification of God, revealing a rhythm of praise that delights in who God is more than what He gives. The soul, enraptured by the beauty and majesty of God, is drawn upward to give Him glory. The language of the prayers consistently directs attention not inward toward the supplicants needs, but upward toward the splendor and sufficiency of God Himself.
This God-centered orientation is especially evident in prayers that begin with humble awe and end in jubilant praise. Consider this line from *Things Needful*:
> “Fill the garden of my soul with the wind of love,
> that the scents of the Christian life may be wafted to others;
> then come and gather fruits to thy glory.
> So shall I fulfil the great end of my being
> to glorify thee and be a blessing to men.”
>
> **Things Needful**
Here, glory is not only Gods due—it is the believers desire. The prayer does not approach God with transaction in mind, but with transformation as its goal: that the heart would be reshaped to delight in God's beauty and magnify His name. Adoration, then, is not merely the first step in prayer; it is the foundation upon which all other expressions—confession, thanksgiving, petition, and intercession—are built.
## Conclusion
In The Valley of Vision, adoration sets the tone for communion with God. Drawing from Matthew Henrys framework, we see that this adoration is deeply rooted in the character of God—His sovereignty, holiness, mercy, and grace. The prayers lead the soul to see God as He truly is, and in seeing Him, to worship Him rightly.
Adoration is never detached from theology. Each prayer is theologically rich, shaped by a deep understanding of Gods attributes, His redemptive work, and His covenantal faithfulness. This theological weight gives adoration its substance—it is not emotion divorced from truth, but feeling rightly aligned with divine reality.
These prayers teach us that adoration is more than a component of prayer—it is the heart of it. It reminds us that prayer begins not with ourselves, but with God. It forms the soul in humility, lifts the eyes to heaven, and prepares the heart for repentance, gratitude, and dependence.
In the next installment of this series, we will explore the theology of Confession in The Valley of Vision, following Henrys method to understand how honest acknowledgment of sin forms a vital part of true communion with God.
## Resources
**The Valley of Vision - Arthur Bennett**
- [The Valley of Vision - Online](https://gppopc.org/resources/valley-of-vision-devotionals/)
- [The Valley of Vison - Purchase](https://banneroftruth.org/us/store/devotionalsdaily-readings/the-valley-of-vision/)
**A Method for Prayer - Matthew Henry**
- [A Method for Prayer - Online](https://mrmatthewhenry.com/wp-content/uploads/2015/05/a-method-for-prayer-1710-edition.pdf)
- [A Method for Prayer - Purchase](https://www.wtsbooks.com/products/a-method-for-prayer-matthew-henry-9781857920680)
@@ -0,0 +1,56 @@
package net.reformedwitness.cog;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import net.reformedwitness.cog.repo.AuthorRepository;
import net.reformedwitness.cog.repo.PostRepository;
/**
* Full-context test against a real Postgres: proves the Flyway schema, the JPA mappings, and the markdown
* seeding (front-matter parsing + HTML rendering) all work end to end.
*/
@SpringBootTest(properties = {
"platform.storage.access-key=test",
"platform.storage.secret-key=test"
})
@Testcontainers
class ConfessionsApplicationTests {
@Container
@ServiceConnection
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>(DockerImageName.parse("postgres:18-alpine"));
@Autowired
PostRepository posts;
@Autowired
AuthorRepository authors;
@Test
void seedsPostsAndAuthorsFromBundledMarkdown() {
assertThat(posts.findByPublishedTrueOrderByPublishedOnDescIdDesc()).isNotEmpty();
assertThat(authors.findAllByOrderByNameAsc()).isNotEmpty();
var fourfold = posts.findBySlug("fourfold");
assertThat(fourfold).isPresent();
assertThat(fourfold.get().getTitle()).isNotBlank();
assertThat(fourfold.get().getAuthor()).isNotBlank();
assertThat(fourfold.get().getTags()).isNotEmpty();
assertThat(fourfold.get().getContentHtml()).contains("<p>");
}
@Test
void tagCountsAreAggregated() {
assertThat(posts.tagCounts()).isNotEmpty();
}
}