SlideShare a Scribd company logo
1 of 20
Download to read offline
TRANSACTIONAL EVENT SOURCING
USING SLICK
ADAM WARSKI
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
EVENT SOURCING?
▸ All changes in the system are captured as a sequence of events
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
WHY EVENT SOURCING?
▸ IT: Information Technology
▸ do not loose information!
▸ Audit log
▸ Re-create system state
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
ME + AUDIT = HIBERNATE ENVERS
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
ME
▸ coder @
▸ Lightbend consulting partner
▸ mainly Scala
▸ open-source: MacWire, ElasticMQ, Bootzooka, …
▸ http://www.warski.org / @adamwarski
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
THE GOAL
▸ Get the benefits of Event Sourcing …
▸ … still being able to leverage RDBMS features
▸ transactions
▸ schema
▸ SQL
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
OTHER APPROACHES
▸ Event Store (https://geteventstore.com)
▸ Akka Persistence (http://doc.akka.io/docs/akka/current)
▸ Eventuate (http://eventuate.io)
▸ + more
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
EVENTS
▸ Immutable
▸ Primary source of truth
▸ Past tense
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
EVENTS
▸ Payload: arbitrary json (case class)
▸ Event type (name of class)
▸ Aggregate type & id
▸ Id, timestamp
▸ Transaction id
▸ User id
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
HOW?
▸ Events are stored in a dedicated table
▸ Basing on events, a read model is updated
▸ similar to what a “traditional” CRUD model could be
▸ Consistency: both done in a single transaction
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
SLICK
▸ We operate on DBIOAction[T]
▸ a description of actions to be done
▸ execution deferred later
▸ can be sequenced using flatMap
▸ yes, it’s a Monad
User data
Transaction
READ MODEL
MODEL
UPDATE
EVENT
LISTENER
External systems
EVENT
PROCESSOR
REGISTRYREGISTRYREGISTRY
Events
COMMAND
EVENT SOURCING LIVE
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
POTENTIAL PROBLEMS
▸ Ordering of concurrent events operating on the same aggregate root
▸ DBIOAction “leaks”
▸ Future wrapping
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
SUMMING UP: FUNCTIONS INVOLVED
▸ Commands: Data => CommandResult[S, F]

that is, DBIOAction[(Either[S, F], List[Event])]
▸ Event listeners: Event => DBIOAction[List[Event]]
▸ Model updates: Event => DBIOAction[Unit]
ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI
LINKS
▸ https://github.com/softwaremill/slick-eventsourcing
▸ README+blog longer than code
▸ only a skeleton
▸ probably for customisation
▸ https://github.com/adamw/slick-eventsourcing-pres
THANK YOU!
Slick eventsourcing
Slick eventsourcing

More Related Content

What's hot

Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Felix Gessert
 

What's hot (20)

AWS Step Function with API Gateway Integration - Metin Kale, Chicago
AWS Step Function with API Gateway Integration - Metin Kale, ChicagoAWS Step Function with API Gateway Integration - Metin Kale, Chicago
AWS Step Function with API Gateway Integration - Metin Kale, Chicago
 
Building an Angular 2 App
Building an Angular 2 AppBuilding an Angular 2 App
Building an Angular 2 App
 
Building a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containersBuilding a multi-tenant cloud service from legacy code with Docker containers
Building a multi-tenant cloud service from legacy code with Docker containers
 
Build your operator with the right tool
Build your operator with the right toolBuild your operator with the right tool
Build your operator with the right tool
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
 
How ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the futureHow ddd, cqrs and event sourcing constitute the architecture of the future
How ddd, cqrs and event sourcing constitute the architecture of the future
 
Kafka Summit SF 2017 - Kafka Stream Processing for Everyone with KSQL
Kafka Summit SF 2017 - Kafka Stream Processing for Everyone with KSQLKafka Summit SF 2017 - Kafka Stream Processing for Everyone with KSQL
Kafka Summit SF 2017 - Kafka Stream Processing for Everyone with KSQL
 
Kubecon 2019_eu-k8s-secrets-csi
Kubecon 2019_eu-k8s-secrets-csiKubecon 2019_eu-k8s-secrets-csi
Kubecon 2019_eu-k8s-secrets-csi
 
Clocker and OpenStack
Clocker and OpenStackClocker and OpenStack
Clocker and OpenStack
 
Reactive database access with Slick3
Reactive database access with Slick3Reactive database access with Slick3
Reactive database access with Slick3
 
Container World 2018
Container World 2018Container World 2018
Container World 2018
 
Building Out Your Kafka Developer CDC Ecosystem
Building Out Your Kafka Developer CDC  EcosystemBuilding Out Your Kafka Developer CDC  Ecosystem
Building Out Your Kafka Developer CDC Ecosystem
 
MongoDB .local Bengaluru 2019: Realm: The Secret Sauce for Better Mobile Apps
MongoDB .local Bengaluru 2019: Realm: The Secret Sauce for Better Mobile AppsMongoDB .local Bengaluru 2019: Realm: The Secret Sauce for Better Mobile Apps
MongoDB .local Bengaluru 2019: Realm: The Secret Sauce for Better Mobile Apps
 
Webinar: Serverless Architectures with AWS Lambda and MongoDB Atlas
Webinar: Serverless Architectures with AWS Lambda and MongoDB AtlasWebinar: Serverless Architectures with AWS Lambda and MongoDB Atlas
Webinar: Serverless Architectures with AWS Lambda and MongoDB Atlas
 
Event sourcing Live 2021: Streaming App Changes to Event Store
Event sourcing Live 2021: Streaming App Changes to Event StoreEvent sourcing Live 2021: Streaming App Changes to Event Store
Event sourcing Live 2021: Streaming App Changes to Event Store
 
NoSQL design pitfalls with Java
NoSQL design pitfalls with JavaNoSQL design pitfalls with Java
NoSQL design pitfalls with Java
 
Modern Cloud-Native Jakarta EE Frameworks: tips, challenges, and trends.
Modern Cloud-Native Jakarta EE Frameworks: tips, challenges, and trends.Modern Cloud-Native Jakarta EE Frameworks: tips, challenges, and trends.
Modern Cloud-Native Jakarta EE Frameworks: tips, challenges, and trends.
 
Riga dev day: Lambda architecture at AWS
Riga dev day: Lambda architecture at AWSRiga dev day: Lambda architecture at AWS
Riga dev day: Lambda architecture at AWS
 
Distributed Eventing in OSGi
Distributed Eventing in OSGiDistributed Eventing in OSGi
Distributed Eventing in OSGi
 
Openstack Overview
Openstack OverviewOpenstack Overview
Openstack Overview
 

Similar to Slick eventsourcing

Using Behavior to Protect Cloud Servers
Using Behavior to Protect Cloud ServersUsing Behavior to Protect Cloud Servers
Using Behavior to Protect Cloud Servers
banerjeea
 
Cloud 101: Hands-on Heroku & AWS
Cloud 101: Hands-on Heroku & AWSCloud 101: Hands-on Heroku & AWS
Cloud 101: Hands-on Heroku & AWS
Amine Sadry
 
Streaming Analytics for Financial Enterprises
Streaming Analytics for Financial EnterprisesStreaming Analytics for Financial Enterprises
Streaming Analytics for Financial Enterprises
Databricks
 

Similar to Slick eventsourcing (20)

Windowing data in big data streams
Windowing data in big data streamsWindowing data in big data streams
Windowing data in big data streams
 
Using Behavior to Protect Cloud Servers
Using Behavior to Protect Cloud ServersUsing Behavior to Protect Cloud Servers
Using Behavior to Protect Cloud Servers
 
The Serverless Cloud @ JAX London 2016
The Serverless Cloud @ JAX London 2016The Serverless Cloud @ JAX London 2016
The Serverless Cloud @ JAX London 2016
 
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
AWS user group Serverless in September - Chris Johnson Bidler "Go Serverless ...
 
ITB2019 Serverless CFML on AWS Lambda - Pete Freitag
ITB2019  Serverless CFML on AWS Lambda - Pete FreitagITB2019  Serverless CFML on AWS Lambda - Pete Freitag
ITB2019 Serverless CFML on AWS Lambda - Pete Freitag
 
Viadeo - The Kasper way
Viadeo - The Kasper wayViadeo - The Kasper way
Viadeo - The Kasper way
 
Stockholm Serverless Meetup - Serverless Challenges
Stockholm Serverless Meetup - Serverless ChallengesStockholm Serverless Meetup - Serverless Challenges
Stockholm Serverless Meetup - Serverless Challenges
 
Big Data on AWS
Big Data on AWSBig Data on AWS
Big Data on AWS
 
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
 
Cloud Native Microservices with Spring Cloud
Cloud Native Microservices with Spring CloudCloud Native Microservices with Spring Cloud
Cloud Native Microservices with Spring Cloud
 
GopherCon Gilmour
GopherCon GilmourGopherCon Gilmour
GopherCon Gilmour
 
Technical Architecture of RASP Technology
Technical Architecture of RASP TechnologyTechnical Architecture of RASP Technology
Technical Architecture of RASP Technology
 
RVASec AWS Survival Guide 2.0
RVASec AWS Survival Guide 2.0RVASec AWS Survival Guide 2.0
RVASec AWS Survival Guide 2.0
 
Serverless Chicago - Datomic Cloud and AWS AppSync - April 26 2018
Serverless Chicago - Datomic Cloud and AWS AppSync - April 26 2018Serverless Chicago - Datomic Cloud and AWS AppSync - April 26 2018
Serverless Chicago - Datomic Cloud and AWS AppSync - April 26 2018
 
Cloud 101: Hands-on Heroku & AWS
Cloud 101: Hands-on Heroku & AWSCloud 101: Hands-on Heroku & AWS
Cloud 101: Hands-on Heroku & AWS
 
Java in the Cloud : PaaS Platforms in Comparison
Java in the Cloud : PaaS Platforms in Comparison Java in the Cloud : PaaS Platforms in Comparison
Java in the Cloud : PaaS Platforms in Comparison
 
Java in the Cloud : PaaS Platforms in Comparison
Java in the Cloud : PaaS Platforms in ComparisonJava in the Cloud : PaaS Platforms in Comparison
Java in the Cloud : PaaS Platforms in Comparison
 
Streaming Analytics for Financial Enterprises
Streaming Analytics for Financial EnterprisesStreaming Analytics for Financial Enterprises
Streaming Analytics for Financial Enterprises
 
Going Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAMGoing Serverless on AWS with Golang and SAM
Going Serverless on AWS with Golang and SAM
 
Cloud Native Microservices with Spring Cloud
Cloud Native Microservices with Spring CloudCloud Native Microservices with Spring Cloud
Cloud Native Microservices with Spring Cloud
 

More from Adam Warski

The ideal module system and the harsh reality
The ideal module system and the harsh realityThe ideal module system and the harsh reality
The ideal module system and the harsh reality
Adam Warski
 

More from Adam Warski (9)

What have the annotations done to us?
What have the annotations done to us?What have the annotations done to us?
What have the annotations done to us?
 
Hejdyk maleńka część mazur
Hejdyk maleńka część mazurHejdyk maleńka część mazur
Hejdyk maleńka część mazur
 
Evaluating persistent, replicated message queues
Evaluating persistent, replicated message queuesEvaluating persistent, replicated message queues
Evaluating persistent, replicated message queues
 
The no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection FrameworkThe no-framework Scala Dependency Injection Framework
The no-framework Scala Dependency Injection Framework
 
ElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS serverElasticMQ: a fully asynchronous, Akka-based SQS server
ElasticMQ: a fully asynchronous, Akka-based SQS server
 
The ideal module system and the harsh reality
The ideal module system and the harsh realityThe ideal module system and the harsh reality
The ideal module system and the harsh reality
 
Recommendation systems with Mahout: introduction
Recommendation systems with Mahout: introductionRecommendation systems with Mahout: introduction
Recommendation systems with Mahout: introduction
 
Scala Macros
Scala MacrosScala Macros
Scala Macros
 
CDI Portable Extensions
CDI Portable ExtensionsCDI Portable Extensions
CDI Portable Extensions
 

Recently uploaded

CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
9953056974 Low Rate Call Girls In Saket, Delhi NCR
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 

Recently uploaded (20)

Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
10 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 202410 Trends Likely to Shape Enterprise Technology in 2024
10 Trends Likely to Shape Enterprise Technology in 2024
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 

Slick eventsourcing

  • 2.
  • 3. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI EVENT SOURCING? ▸ All changes in the system are captured as a sequence of events
  • 4. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI WHY EVENT SOURCING? ▸ IT: Information Technology ▸ do not loose information! ▸ Audit log ▸ Re-create system state
  • 5. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI ME + AUDIT = HIBERNATE ENVERS
  • 6. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI ME ▸ coder @ ▸ Lightbend consulting partner ▸ mainly Scala ▸ open-source: MacWire, ElasticMQ, Bootzooka, … ▸ http://www.warski.org / @adamwarski
  • 7. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI THE GOAL ▸ Get the benefits of Event Sourcing … ▸ … still being able to leverage RDBMS features ▸ transactions ▸ schema ▸ SQL
  • 8. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI OTHER APPROACHES ▸ Event Store (https://geteventstore.com) ▸ Akka Persistence (http://doc.akka.io/docs/akka/current) ▸ Eventuate (http://eventuate.io) ▸ + more
  • 9. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI EVENTS ▸ Immutable ▸ Primary source of truth ▸ Past tense
  • 10. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI EVENTS ▸ Payload: arbitrary json (case class) ▸ Event type (name of class) ▸ Aggregate type & id ▸ Id, timestamp ▸ Transaction id ▸ User id
  • 11. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI HOW? ▸ Events are stored in a dedicated table ▸ Basing on events, a read model is updated ▸ similar to what a “traditional” CRUD model could be ▸ Consistency: both done in a single transaction
  • 12. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI SLICK ▸ We operate on DBIOAction[T] ▸ a description of actions to be done ▸ execution deferred later ▸ can be sequenced using flatMap ▸ yes, it’s a Monad
  • 13. User data Transaction READ MODEL MODEL UPDATE EVENT LISTENER External systems EVENT PROCESSOR REGISTRYREGISTRYREGISTRY Events COMMAND
  • 15. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI POTENTIAL PROBLEMS ▸ Ordering of concurrent events operating on the same aggregate root ▸ DBIOAction “leaks” ▸ Future wrapping
  • 16. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI SUMMING UP: FUNCTIONS INVOLVED ▸ Commands: Data => CommandResult[S, F]
 that is, DBIOAction[(Either[S, F], List[Event])] ▸ Event listeners: Event => DBIOAction[List[Event]] ▸ Model updates: Event => DBIOAction[Unit]
  • 17. ADAM WARSKI, SOFTWAREMILL @ADAMWARSKI LINKS ▸ https://github.com/softwaremill/slick-eventsourcing ▸ README+blog longer than code ▸ only a skeleton ▸ probably for customisation ▸ https://github.com/adamw/slick-eventsourcing-pres