Phase 07: Admin Forms & Lists - 3 plan(s) in 2 wave(s) - Wave 1: 07-01 (YAML parsing, WidgetRegistry, FormRenderer) - Wave 2: 07-02 (form widgets), 07-03 (list rendering) - parallel - Ready for execution
SummerCMS
A Scala/ZIO-based Content Management Framework — a modern rewrite of WinterCMS/OctoberCMS with better performance, type safety, and horizontal scaling.
Status
Phase 1: Foundation — Complete
- Mill build system with Scala 3.3.4
- ZIO HTTP server with health endpoints
- PostgreSQL integration via Quill (compile-time SQL validation)
- Flyway database migrations
- Repository pattern with typed errors
- Pulumi/Besom infrastructure for AWS deployment
- Docker containerization
Requirements
- Java 21+ (tested with Java 25)
- PostgreSQL 14+
- Mill 1.1.1+ (included as
./milllauncher)
Quick Start
1. Database Setup
# Create database user and database
sudo -u postgres psql -c "CREATE USER summercms WITH PASSWORD 'summercms';"
sudo -u postgres psql -c "CREATE DATABASE summercms OWNER summercms;"
Or use environment variables to connect to an existing database.
2. Run the Server
# Start the development server
./mill summercms.run
You should see the SummerCMS banner and the server starting on port 8080.
3. Verify
# Health check (always returns 200)
curl http://localhost:8080/health
# Readiness check (returns 200 if database connected, 503 otherwise)
curl http://localhost:8080/ready
Configuration
Configuration uses HOCON format in summercms/resources/application.conf. Environment variables override defaults:
| Variable | Default | Description |
|---|---|---|
SERVER_HOST |
0.0.0.0 | Server bind address |
SERVER_PORT |
8080 | Server port |
DB_HOST |
localhost | PostgreSQL host |
DB_PORT |
5432 | PostgreSQL port |
DB_NAME |
summercms | Database name |
DB_USER |
summercms | Database user |
DB_PASSWORD |
summercms | Database password |
Project Structure
summercms/
├── build.mill # Mill build configuration
├── summercms/
│ ├── src/
│ │ ├── Main.scala # Application entry point
│ │ ├── api/ # HTTP routes
│ │ │ ├── Routes.scala
│ │ │ └── HealthRoutes.scala
│ │ ├── config/ # Configuration
│ │ │ └── AppConfig.scala
│ │ ├── db/ # Database layer
│ │ │ ├── QuillContext.scala
│ │ │ └── Migrator.scala
│ │ ├── model/ # Domain models
│ │ │ └── User.scala
│ │ └── repository/ # Data access
│ │ ├── RepositoryError.scala
│ │ └── UserRepository.scala
│ └── resources/
│ ├── application.conf # HOCON configuration
│ └── db/migration/ # Flyway SQL migrations
├── infra/ # Pulumi/Besom infrastructure
│ ├── project.scala
│ └── Main.scala
└── Dockerfile # Container build
Development
Build Commands
# Compile
./mill summercms.compile
# Run
./mill summercms.run
# Build fat JAR
./mill summercms.assembly
# Run tests
./mill summercms.test
Database Migrations
Migrations are in summercms/resources/db/migration/ using Flyway naming convention (V1__description.sql).
Migrations are not auto-run on startup. They will be invoked via CLI commands (coming in Phase 5).
Docker
# Build image
docker build -t summercms .
# Run container
docker run -p 8080:8080 \
-e DB_HOST=host.docker.internal \
-e DB_PASSWORD=secret \
summercms
Infrastructure (Pulumi)
The infra/ directory contains Pulumi infrastructure using Besom (Scala Pulumi SDK):
cd infra
pulumi stack init dev
pulumi config set dbPassword --secret <password>
pulumi up
Defines:
- S3 bucket for assets
- RDS PostgreSQL instance
Tech Stack
| Component | Technology |
|---|---|
| Language | Scala 3.3.4 |
| Effect System | ZIO 2.1.14 |
| HTTP Server | zio-http 3.0.1 |
| Database | PostgreSQL + Quill 4.8.5 |
| Migrations | Flyway 10.21.0 |
| Configuration | zio-config + HOCON |
| Build | Mill 1.1.1 |
| Infrastructure | Pulumi + Besom 0.5.0 |
Roadmap
SummerCMS is being built in phases:
- Phase 1: Foundation — Database, migrations, repository pattern, deployment
- Phase 2: Plugin System — Plugin discovery, lifecycle, dependencies, extension API
- Phase 3: Component System — Reusable UI components with HTMX handlers
- Phase 4: Theme Engine — Layouts, partials, asset management, Vue integration
- Phase 5: CLI Scaffolding — Commands to create plugins, themes, components
- Phase 6: Backend Authentication — Admin users, login/logout, RBAC
- Phase 7: Admin Forms & Lists — YAML-driven form and list generation
- Phase 8: Admin Dashboard — Dashboard widgets and plugin settings
- Phase 9: Content Management — CMS pages, media library, menus
- Phase 10: Core Plugins — User plugin and Blog plugin
License
[TBD]