diff --git a/build.sbt b/build.sbt
index 80c696d3..50536227 100644
--- a/build.sbt
+++ b/build.sbt
@@ -48,14 +48,12 @@ lazy val root = project
)
)
-def lines(lines: String*) = lines.mkString("\n")
def slugify(name: String): String = name.toLowerCase().replace("-", "_")
-def listMarkdowns(file: File): Seq[File] = file.listFiles().filter(_.getName.endsWith(".md")).toList
-def listFolders(file: File): Seq[File] = file.listFiles().filter(_.isDirectory()).toList
+val allConferences = new File("./public/conferences")
def eventListing() = Def.task {
val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "EventsData.scala"
- val events = listMarkdowns(new File("./public/scalafr-meetups"))
+ val events = allConferences.listFiles(_.name.endsWith(".md"))
val content =
s"""|package io.scala.data
|
@@ -71,10 +69,9 @@ def eventListing() = Def.task {
def confListing() = Def.task {
val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "ConfsData.scala"
- val conferences = listFolders(new File("./public/conferences")).map { folder =>
- val conference = listMarkdowns(folder).find(_.getName == "conference.md").get
- val folderSlug = slugify(folder.getName)
- folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(conference) + "\"" * 3}"""
+ val conferences = allConferences.globRecursive(_.name == "conference.md").get().map { file =>
+ val folderSlug = slugify(file.getParentFile().name)
+ folderSlug -> s"""| def ${folderSlug}: String = ${"\"" * 3 + IO.read(file) + "\"" * 3}"""
}
val content =
@@ -93,12 +90,12 @@ def confListing() = Def.task {
def sessionsListing() = Def.task {
val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SessionsData.scala"
- val sessionsByConf = listFolders(new File("./public/conferences")).map { folder =>
- val sessions = listMarkdowns(folder).filter(_.getName != "conference.md")
- s"""| def ${slugify(
- folder
- .getName()
- )}: List[String] = List(${sessions.map(file => "\"" * 3 + IO.read(file) + "\"" * 3).mkString(",")})"""
+ val sessionsByConf = allConferences.listFiles(_.isDirectory()).map { folder =>
+ val sessions = (folder / "sessions").listFiles()
+ val slug = slugify(folder.getName)
+ s"""| def $slug: List[String] = List(${sessions
+ .map(file => "\"" * 3 + IO.read(file) + "\"" * 3)
+ .mkString(",")})"""
}
val content =
@@ -116,9 +113,10 @@ def sessionsListing() = Def.task {
def sponsorListing() = Def.task {
val file = (Compile / sourceManaged).value / "io" / "scala" / "data" / "SponsorsData.scala"
- val sponsors = listMarkdowns(new File("./public/sponsors")).map { md =>
- s"""| def ${slugify(md.base)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}"""
- }
+ val sponsors =
+ allConferences.globRecursive(_.name == "sponsors.md").get().map { md =>
+ s"""| def ${slugify(md.getParentFile.name)}: String = ${"\"" * 3 + IO.read(md) + "\"" * 3}"""
+ }
val content =
s"""|package io.scala.data
diff --git a/index.html b/index.html
index 90dc4ac7..a894b1c0 100644
--- a/index.html
+++ b/index.html
@@ -13,13 +13,13 @@
-
+
ScalaIO
diff --git a/public/.git-blame-ignore-revs b/public/.git-blame-ignore-revs
deleted file mode 100644
index e69de29b..00000000
diff --git a/public/conferences/nantes-2024/armored-type-safety-with-iron.md b/public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md
similarity index 96%
rename from public/conferences/nantes-2024/armored-type-safety-with-iron.md
rename to public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md
index b149aa3a..a48e349a 100644
--- a/public/conferences/nantes-2024/armored-type-safety-with-iron.md
+++ b/public/conferences/nantes-2024/sessions/armored-type-safety-with-iron.md
@@ -23,7 +23,7 @@ In this talk, we’ll show first the different technique we can use to apply con
### Raphaël Lemaitre
-- photoRelPath: /images/profiles/nantes-2024/rLemaitre.webp
+- photoRelPath: /images/profiles/speakers/rLemaitre.webp
- job: Senior Staff Engineer @ Ledger
#### Links
@@ -47,7 +47,7 @@ My interests span from software development to history and technology, where I e
### Valentin Bergeron
-- photoRelPath: /images/profiles/nantes-2024/vBergeron.webp
+- photoRelPath: /images/profiles/speakers/vBergeron.webp
- job: Engineering team lead @ Ledger
#### Links
diff --git a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md
similarity index 94%
rename from public/conferences/nantes-2024/chasing-arrows-functors-monads.md
rename to public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md
index 30a86a20..1c4c86ab 100644
--- a/public/conferences/nantes-2024/chasing-arrows-functors-monads.md
+++ b/public/conferences/nantes-2024/sessions/chasing-arrows-functors-monads.md
@@ -4,7 +4,7 @@
- Slug: chasing-arrows-functors-monads
- Category: Algebra
- confirmed: true
-- Slides: https://scala.io/slides/2024/chasing-arrows.pdf
+- Slides: /conferences/nantes-2024/slides/2024/chasing-arrows.pdf
- Replay: https://www.youtube.com/watch?v=KFhhR6tSy_0&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=12&pp=iAQB
## Abstract
@@ -26,7 +26,7 @@ This ScalaIO talk will be a overview of the EPITA CT4P course, with emphasis on
### Jim Newton
-- photoRelPath: /images/profiles/nantes-2024/jim.webp
+- photoRelPath: /images/profiles/speakers/jim.webp
- job: Researcher @ EPITA Le Kremlin-Bicêtre
#### Links
@@ -46,7 +46,7 @@ Jim has been programming off and on in Scala for about 5 years.
### Uli Fahrenberg
-- photoRelPath: /images/profiles/nantes-2024/uli.webp
+- photoRelPath: /images/profiles/speakers/uli.webp
- job: @ EPITA Rennes
#### Links
diff --git a/public/conferences/nantes-2024/contravariance-intuition-building.md b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md
similarity index 94%
rename from public/conferences/nantes-2024/contravariance-intuition-building.md
rename to public/conferences/nantes-2024/sessions/contravariance-intuition-building.md
index 86372fba..e72bca66 100644
--- a/public/conferences/nantes-2024/contravariance-intuition-building.md
+++ b/public/conferences/nantes-2024/sessions/contravariance-intuition-building.md
@@ -4,7 +4,7 @@
- Slug: contravariance-intuition-building
- Category: Modeling
- confirmed: true
-- Slides: https://scala.io/slides/2024/Contravariance.pdf
+- Slides: /conferences/nantes-2024/slides/2024/Contravariance.pdf
- Replay: https://www.youtube.com/watch?v=A7t3b0kymFM&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=13&pp=iAQB
## Abstract
@@ -31,7 +31,7 @@ We’ll begin by working with an Animal type hierarchy and some PetRescue and Pe
### Sophie Collard
-- photoRelPath: /images/profiles/nantes-2024/sCollard.webp
+- photoRelPath: /images/profiles/speakers/sCollard.webp
- job: Lead Software Engineer @ JPMorgan
#### Links
diff --git a/public/conferences/nantes-2024/data-pipelines-simple.md b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md
similarity index 90%
rename from public/conferences/nantes-2024/data-pipelines-simple.md
rename to public/conferences/nantes-2024/sessions/data-pipelines-simple.md
index a728cade..7bf2cfc6 100644
--- a/public/conferences/nantes-2024/data-pipelines-simple.md
+++ b/public/conferences/nantes-2024/sessions/data-pipelines-simple.md
@@ -4,7 +4,7 @@
- Slug: data-pipelines-simple
- Category: DataEng
- confirmed: true
-- Slides: https://scala.io/slides/2024/data-pipeline.pptx
+- Slides: /conferences/nantes-2024/slides/2024/data-pipeline.pptx
- Replay: https://www.youtube.com/watch?v=gS6zOfqUHVs&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=8&pp=iAQB
## Abstract
@@ -17,7 +17,7 @@ Most organizations have data pipelines and those are growing by the minute. But
### Raphael Claude
-- photoRelPath: /images/profiles/nantes-2024/rClaude.webp
+- photoRelPath: /images/profiles/speakers/rClaude.webp
- job: Staff Dev Lead @ Criteo
#### Links
diff --git a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md b/public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md
similarity index 96%
rename from public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md
rename to public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md
index 3059a3c1..705442e4 100644
--- a/public/conferences/nantes-2024/dependent-types-from-theory-to-practice.md
+++ b/public/conferences/nantes-2024/sessions/dependent-types-from-theory-to-practice.md
@@ -23,7 +23,7 @@ Nous aborderons: le type fonctionnel dépendant, la paire dépendante, le type s
### Didier Plaindoux
-- photoRelPath: /images/profiles/nantes-2024/dPlaindoux.webp
+- photoRelPath: /images/profiles/speakers/dPlaindoux.webp
- job: Senior Software Engineer @ Fungus (Freelance)
#### Links
diff --git a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md
similarity index 92%
rename from public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md
rename to public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md
index d78d909a..96324b00 100644
--- a/public/conferences/nantes-2024/hands-on-besom-iac-with-scala.md
+++ b/public/conferences/nantes-2024/sessions/hands-on-besom-iac-with-scala.md
@@ -4,7 +4,7 @@
- Slug: hands-on-besom-iac-with-scala
- Category: Cloud
- confirmed: true
-- Slides: https://scala.io/slides/2024/besom.pdf
+- Slides: /conferences/nantes-2024/slides/2024/besom.pdf
- Replay: https://www.youtube.com/watch?v=J0vXLHN8YpA&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=7&pp=iAQB
## Abstract
@@ -17,7 +17,7 @@ In my talk I will briefly introduce Besom, a Pulumi SDK for Scala and then swift
### Łukasz Biały
-- photoRelPath: /images/profiles/nantes-2024/lBialy.webp
+- photoRelPath: /images/profiles/speakers/lBialy.webp
- job: Software Engineer @ VirtusLab
#### Links
diff --git a/public/conferences/nantes-2024/intro-to-gadts.md b/public/conferences/nantes-2024/sessions/intro-to-gadts.md
similarity index 89%
rename from public/conferences/nantes-2024/intro-to-gadts.md
rename to public/conferences/nantes-2024/sessions/intro-to-gadts.md
index da53063b..bd6aaa4a 100644
--- a/public/conferences/nantes-2024/intro-to-gadts.md
+++ b/public/conferences/nantes-2024/sessions/intro-to-gadts.md
@@ -4,7 +4,7 @@
- Slug: intro-to-gadts
- Category: Algebra
- confirmed: true
-- Slides: https://scala.io/slides/2024/GADTs-xavier-vw-woestyne.pdf
+- Slides: /conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf
- Replay: https://www.youtube.com/watch?v=r4c7xuVB9xA&ab_channel=ScalaIOFR
## Abstract
@@ -17,7 +17,7 @@ Les GADTs et Scala, c’est une très longue histoire de “je t’aime, moi non
### Xavier Van de Woestyne
-- photoRelPath: /images/profiles/nantes-2024/xVdW.webp
+- photoRelPath: /images/profiles/speakers/xVdW.webp
- job: Software Engineer @ The Funkyworkers
#### Links
diff --git a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md b/public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md
similarity index 97%
rename from public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md
rename to public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md
index 932cba6f..c58cb731 100644
--- a/public/conferences/nantes-2024/introduction-to-smithy-smithy4s.md
+++ b/public/conferences/nantes-2024/sessions/introduction-to-smithy-smithy4s.md
@@ -23,7 +23,7 @@ This talk will serve as an introduction to the Smithy IDL, and a demo of what is
### Olivier Mélois
-- photoRelPath: /images/profiles/nantes-2024/oMelois.webp
+- photoRelPath: /images/profiles/speakers/oMelois.webp
- job: Principal Engineer @ Disney Streaming Services
#### Links
diff --git a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md b/public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md
similarity index 95%
rename from public/conferences/nantes-2024/kapoeira-with-kafka-streams.md
rename to public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md
index 0db262a2..2d6fceb8 100644
--- a/public/conferences/nantes-2024/kapoeira-with-kafka-streams.md
+++ b/public/conferences/nantes-2024/sessions/kapoeira-with-kafka-streams.md
@@ -27,7 +27,7 @@ Si vous êtes intéressés, nous serons ravis de récolter vos retours et vos co
### Johanna Vauchel
-- photoRelPath: /images/profiles/nantes-2024/jVauchel.webp
+- photoRelPath: /images/profiles/speakers/jVauchel.webp
- job: Data Engineer @ Lectra
#### Links
@@ -44,7 +44,7 @@ Diplômée de l'INSA de Rouen spécialité Génie Mathématique, j'ai commencé
### Mehdi Rebiai
-- photoRelPath: /images/profiles/nantes-2024/mRebiai.webp
+- photoRelPath: /images/profiles/speakers/mRebiai.webp
- job: Data Engineer, Tech Lead @ Lectra
- confirmed: true
diff --git a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md b/public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md
similarity index 96%
rename from public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md
rename to public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md
index fe1d3d41..595b52d0 100644
--- a/public/conferences/nantes-2024/logic-meta-programming-for-functional-languages.md
+++ b/public/conferences/nantes-2024/sessions/logic-meta-programming-for-functional-languages.md
@@ -17,7 +17,7 @@ Since the beginning of the 21st century, the functional programming paradigm, wh
### Enzo Crance
-- photoRelPath: /images/profiles/nantes-2024/eCrance.webp
+- photoRelPath: /images/profiles/speakers/eCrance.webp
- job: PhD Student @ INRIA
#### Links
diff --git a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md
similarity index 96%
rename from public/conferences/nantes-2024/migrating-gallia-to-scala-3.md
rename to public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md
index 08e7704c..47e74c12 100644
--- a/public/conferences/nantes-2024/migrating-gallia-to-scala-3.md
+++ b/public/conferences/nantes-2024/sessions/migrating-gallia-to-scala-3.md
@@ -4,7 +4,7 @@
- Slug: migrating-gallia-to-scala-3
- Category: ToolsEcosystem
- confirmed: true
-- Slides: https://scala.io/slides/2024/gallia-migration.pdf
+- Slides: /conferences/nantes-2024/slides/2024/gallia-migration.pdf
- Replay: https://www.youtube.com/watch?v=DzjvFx5YYik&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=14&pp=iAQB
## Abstract
@@ -21,7 +21,7 @@ I will briefly introduce how certain features [worked before](https://github.com
### Anthony Cros
-- photoRelPath: /images/profiles/nantes-2024/aCros.webp
+- photoRelPath: /images/profiles/speakers/aCros.webp
- job: Software Architect @ Self-employed
#### Links
diff --git a/public/conferences/nantes-2024/my-first-year-in-scala.md b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md
similarity index 94%
rename from public/conferences/nantes-2024/my-first-year-in-scala.md
rename to public/conferences/nantes-2024/sessions/my-first-year-in-scala.md
index 136721cb..5f9f6c51 100644
--- a/public/conferences/nantes-2024/my-first-year-in-scala.md
+++ b/public/conferences/nantes-2024/sessions/my-first-year-in-scala.md
@@ -4,7 +4,7 @@
- Slug: my-first-year-in-scala
- Category: Community
- confirmed: true
-- Slides: https://scala.io/slides/2024/first-year-scala.pdf
+- Slides: /conferences/nantes-2024/slides/2024/first-year-scala.pdf
- Replay: https://www.youtube.com/watch?v=Jyn2l1nhwZE&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=3&pp=iAQB
## Abstract
@@ -27,7 +27,7 @@ By the end of this talk, I hope that newcomers will feel less alone and more opt
### Monica McGuigan
-- photoRelPath: /images/profiles/nantes-2024/mMcGuigan.webp
+- photoRelPath: /images/profiles/speakers/mMcGuigan.webp
- job: Software Engineer @ JP Morgan
#### Links
diff --git a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md
similarity index 92%
rename from public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md
rename to public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md
index 3e4db610..6b93cd01 100644
--- a/public/conferences/nantes-2024/nails-are-tree-need-chainsaw.md
+++ b/public/conferences/nantes-2024/sessions/nails-are-tree-need-chainsaw.md
@@ -4,7 +4,7 @@
- Slug: nails-are-tree-need-chainsaw
- Category: Algebra
- confirmed: true
-- Slides: https://scala.io/slides/2024/Chainsaw.pdf
+- Slides: /conferences/nantes-2024/slides/2024/Chainsaw.pdf
- Replay: https://www.youtube.com/watch?v=0unlHZmNYkw&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=5&pp=iAQB
## Abstract
@@ -24,7 +24,7 @@ the process and how it helped me solved my problems with less pain.
### Matthieu Baechler
-- photoRelPath: /images/profiles/nantes-2024/mBaechler.webp
+- photoRelPath: /images/profiles/speakers/mBaechler.webp
- job: Developer @ Freelancer
#### Links
diff --git a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md b/public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md
similarity index 92%
rename from public/conferences/nantes-2024/rex-migration-scala-2-to-3.md
rename to public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md
index 93a2d0fd..f044683a 100644
--- a/public/conferences/nantes-2024/rex-migration-scala-2-to-3.md
+++ b/public/conferences/nantes-2024/sessions/rex-migration-scala-2-to-3.md
@@ -26,7 +26,7 @@ tout ça dans le but d'accéder au trésor : Scala 3.
### Antoine Blondeau
-- photoRelPath: /images/profiles/nantes-2024/aBlondeau.webp
+- photoRelPath: /images/profiles/speakers/aBlondeau.webp
- job: Developer @ Clever Cloud
#### Links
@@ -42,7 +42,7 @@ I'm a backend developer specialized in platform orchestration. I have experience
### Jean-Baptiste Kaiser
-- photoRelPath: /images/profiles/nantes-2024/jbKaiser.webp
+- photoRelPath: /images/profiles/speakers/jbKaiser.webp
- job: Scala Developer @ Clever Cloud
- confirmed: true
diff --git a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md b/public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md
similarity index 97%
rename from public/conferences/nantes-2024/scala-3-compiler-academy-journey.md
rename to public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md
index e16542c7..d8b17b9d 100644
--- a/public/conferences/nantes-2024/scala-3-compiler-academy-journey.md
+++ b/public/conferences/nantes-2024/sessions/scala-3-compiler-academy-journey.md
@@ -19,7 +19,7 @@ Now, two years later, with the format fleshed out and the lessons learnt, I’d
### Anatolii Kmetiuk
-- photoRelPath: /images/profiles/nantes-2024/toli.webp
+- photoRelPath: /images/profiles/speakers/toli.webp
- job: Compiler engineer and community manager @ Scala Center, EPFL
#### Links
diff --git a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md b/public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md
similarity index 96%
rename from public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md
rename to public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md
index 9816785c..461e5747 100644
--- a/public/conferences/nantes-2024/songwriting-in-scala-dsl-and-adt.md
+++ b/public/conferences/nantes-2024/sessions/songwriting-in-scala-dsl-and-adt.md
@@ -23,7 +23,7 @@ Topics covered:
### Paul Matthews
-- photoRelPath: /images/profiles/nantes-2024/pMatthews.webp
+- photoRelPath: /images/profiles/speakers/pMatthews.webp
- job: Backend Scala Developer @ ClearScore
#### Links
diff --git a/public/conferences/nantes-2024/ukraine-scala-community.md b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md
similarity index 94%
rename from public/conferences/nantes-2024/ukraine-scala-community.md
rename to public/conferences/nantes-2024/sessions/ukraine-scala-community.md
index f9963434..749648f0 100644
--- a/public/conferences/nantes-2024/ukraine-scala-community.md
+++ b/public/conferences/nantes-2024/sessions/ukraine-scala-community.md
@@ -4,7 +4,7 @@
- Slug: ukraine-scala-community
- Category: Community
- confirmed: true
-- Slides: https://scala.io/slides/2024/scala-community-building-lessons.pptx
+- Slides: /conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx
- Replay: https://www.youtube.com/watch?v=6skPn0evEE8&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=11&pp=iAQB
## Abstract
@@ -21,7 +21,7 @@ Discover our presence at conferences, active engagement in programs such as Goog
### Olya Mazhara
-- photoRelPath: /images/profiles/nantes-2024/oMazhara.webp
+- photoRelPath: /images/profiles/speakers/oMazhara.webp
- job: Software Engineer @ Intellias
#### Links
diff --git a/public/conferences/nantes-2024/unleashing-scalafix-potential.md b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md
similarity index 94%
rename from public/conferences/nantes-2024/unleashing-scalafix-potential.md
rename to public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md
index 6ab4699a..113f0ca5 100644
--- a/public/conferences/nantes-2024/unleashing-scalafix-potential.md
+++ b/public/conferences/nantes-2024/sessions/unleashing-scalafix-potential.md
@@ -4,7 +4,7 @@
- Slug: unleashing-scalafix-potential
- Category: ToolsEcosystem
- confirmed: true
-- Slides: https://scala.io/slides/2024/scalafix.pdf
+- Slides: /conferences/nantes-2024/slides/2024/scalafix.pdf
- Replay: https://www.youtube.com/watch?v=qexJYvo2EwY&list=PLjkHSzY9VuL96myavOIICS-x6yVyAMPjg&index=15&pp=iAQB
## Abstract
@@ -21,7 +21,7 @@ In this talk, we will [demystify AST traversal and semantic information lookup](
### Brice Jaglin
-- photoRelPath: /images/profiles/nantes-2024/bJaglin.webp
+- photoRelPath: /images/profiles/speakers/bJaglin.webp
- job: Staff Engineer @ Swile
#### Links
diff --git a/public/conferences/nantes-2024/unwrapping-io.md b/public/conferences/nantes-2024/sessions/unwrapping-io.md
similarity index 97%
rename from public/conferences/nantes-2024/unwrapping-io.md
rename to public/conferences/nantes-2024/sessions/unwrapping-io.md
index b367d2da..a502c939 100644
--- a/public/conferences/nantes-2024/unwrapping-io.md
+++ b/public/conferences/nantes-2024/sessions/unwrapping-io.md
@@ -23,7 +23,7 @@ We will compare both the low-level aspects, as well as take a look at structured
### Adam Warski
-- photoRelPath: /images/profiles/nantes-2024/aWarski.webp
+- photoRelPath: /images/profiles/speakers/aWarski.webp
- job: Co-founder @ SoftwareMill
#### Links
diff --git a/public/conferences/nantes-2024/use-ai-in-your-programs.md b/public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md
similarity index 94%
rename from public/conferences/nantes-2024/use-ai-in-your-programs.md
rename to public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md
index fed6411f..b755ed02 100644
--- a/public/conferences/nantes-2024/use-ai-in-your-programs.md
+++ b/public/conferences/nantes-2024/sessions/use-ai-in-your-programs.md
@@ -19,7 +19,7 @@ Une fois ceci fait, je souhaite montrer comment utiliser un modèle en utilisant
### François Laroche
-- photoRelPath: /images/profiles/nantes-2024/fLaroche.webp
+- photoRelPath: /images/profiles/speakers/fLaroche.webp
- job: Tech Lead @ NuMind
#### Links
@@ -37,7 +37,7 @@ Je suis actuellement développeur chez NuMind où nous aidons nos clients à ent
### Samuel Bernard
-- photoRelPath: /images/profiles/nantes-2024/sBernard.webp
+- photoRelPath: /images/profiles/speakers/sBernard.webp
- job: Co-Founder & CTO @ NuMind
#### Links
diff --git a/public/slides/2024/Chainsaw.pdf b/public/conferences/nantes-2024/slides/2024/Chainsaw.pdf
similarity index 100%
rename from public/slides/2024/Chainsaw.pdf
rename to public/conferences/nantes-2024/slides/2024/Chainsaw.pdf
diff --git a/public/slides/2024/Contravariance.pdf b/public/conferences/nantes-2024/slides/2024/Contravariance.pdf
similarity index 100%
rename from public/slides/2024/Contravariance.pdf
rename to public/conferences/nantes-2024/slides/2024/Contravariance.pdf
diff --git a/public/slides/2024/GADTs-xavier-vw-woestyne.pdf b/public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf
similarity index 100%
rename from public/slides/2024/GADTs-xavier-vw-woestyne.pdf
rename to public/conferences/nantes-2024/slides/2024/GADTs-xavier-vw-woestyne.pdf
diff --git a/public/slides/2024/besom.pdf b/public/conferences/nantes-2024/slides/2024/besom.pdf
similarity index 100%
rename from public/slides/2024/besom.pdf
rename to public/conferences/nantes-2024/slides/2024/besom.pdf
diff --git a/public/slides/2024/chasing-arrows.pdf b/public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf
similarity index 100%
rename from public/slides/2024/chasing-arrows.pdf
rename to public/conferences/nantes-2024/slides/2024/chasing-arrows.pdf
diff --git a/public/slides/2024/data-pipeline.pptx b/public/conferences/nantes-2024/slides/2024/data-pipeline.pptx
similarity index 100%
rename from public/slides/2024/data-pipeline.pptx
rename to public/conferences/nantes-2024/slides/2024/data-pipeline.pptx
diff --git a/public/slides/2024/first-year-scala.pdf b/public/conferences/nantes-2024/slides/2024/first-year-scala.pdf
similarity index 100%
rename from public/slides/2024/first-year-scala.pdf
rename to public/conferences/nantes-2024/slides/2024/first-year-scala.pdf
diff --git a/public/slides/2024/gallia-migration.pdf b/public/conferences/nantes-2024/slides/2024/gallia-migration.pdf
similarity index 100%
rename from public/slides/2024/gallia-migration.pdf
rename to public/conferences/nantes-2024/slides/2024/gallia-migration.pdf
diff --git a/public/slides/2024/scala-community-building-lessons.pptx b/public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx
similarity index 100%
rename from public/slides/2024/scala-community-building-lessons.pptx
rename to public/conferences/nantes-2024/slides/2024/scala-community-building-lessons.pptx
diff --git a/public/slides/2024/scalafix.pdf b/public/conferences/nantes-2024/slides/2024/scalafix.pdf
similarity index 100%
rename from public/slides/2024/scalafix.pdf
rename to public/conferences/nantes-2024/slides/2024/scalafix.pdf
diff --git a/public/sponsors/nantes-2024.md b/public/conferences/nantes-2024/sponsors.md
similarity index 100%
rename from public/sponsors/nantes-2024.md
rename to public/conferences/nantes-2024/sponsors.md
diff --git a/public/conferences/paris-2024/anatomy-scaladex.md b/public/conferences/paris-2024/sessions/anatomy-scaladex.md
similarity index 97%
rename from public/conferences/paris-2024/anatomy-scaladex.md
rename to public/conferences/paris-2024/sessions/anatomy-scaladex.md
index c8f08894..9cd1ce14 100644
--- a/public/conferences/paris-2024/anatomy-scaladex.md
+++ b/public/conferences/paris-2024/sessions/anatomy-scaladex.md
@@ -19,7 +19,7 @@ In this talk, I will introduce you to Scaladex, an exciting project I began expl
### Kannupriya Kalra
-- photoRelPath: /images/profiles/paris-2024/kKalra.webp
+- photoRelPath: /images/profiles/speakers/kKalra.webp
- job: Scala Developer @ Sky
#### Links
diff --git a/public/conferences/paris-2024/better-builds-with-mill.md b/public/conferences/paris-2024/sessions/better-builds-with-mill.md
similarity index 95%
rename from public/conferences/paris-2024/better-builds-with-mill.md
rename to public/conferences/paris-2024/sessions/better-builds-with-mill.md
index 2517f483..dcd59690 100644
--- a/public/conferences/paris-2024/better-builds-with-mill.md
+++ b/public/conferences/paris-2024/sessions/better-builds-with-mill.md
@@ -15,7 +15,7 @@ Mill is a Scala build tool that improves upon the SBT toolchain: more performant
### Li Haoyi
-- photoRelPath: /images/profiles/paris-2024/lHaoyi.webp
+- photoRelPath: /images/profiles/speakers/lHaoyi.webp
- job: N/A
#### Links
diff --git a/public/conferences/paris-2024/beyond-basics-lsp.md b/public/conferences/paris-2024/sessions/beyond-basics-lsp.md
similarity index 95%
rename from public/conferences/paris-2024/beyond-basics-lsp.md
rename to public/conferences/paris-2024/sessions/beyond-basics-lsp.md
index 2e87db01..f0697344 100644
--- a/public/conferences/paris-2024/beyond-basics-lsp.md
+++ b/public/conferences/paris-2024/sessions/beyond-basics-lsp.md
@@ -15,7 +15,7 @@ LSP has greatly standardised the behaviour of IDEs, in a good direction: we can
### Xavier Van de Woestyne
-- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp
+- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp
- job: OCaml Software Engineering at Tarides
#### Links
diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md
similarity index 97%
rename from public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md
rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md
index c4e09e18..46dc1871 100644
--- a/public/conferences/paris-2024/building-robust-applications-with-kyo-intro.md
+++ b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo-intro.md
@@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d
### Adam Hearn
-- photoRelPath: /images/profiles/paris-2024/aHearn.jpg
+- photoRelPath: /images/profiles/speakers/aHearn.jpg
- job: Sofware Engineer @ Amazon
#### Links
diff --git a/public/conferences/paris-2024/building-robust-applications-with-kyo.md b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md
similarity index 97%
rename from public/conferences/paris-2024/building-robust-applications-with-kyo.md
rename to public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md
index cf29bd78..db3aade6 100644
--- a/public/conferences/paris-2024/building-robust-applications-with-kyo.md
+++ b/public/conferences/paris-2024/sessions/building-robust-applications-with-kyo.md
@@ -21,7 +21,7 @@ Participants should have basic Scala knowledge and bring a laptop with a Scala d
### Adam Hearn
-- photoRelPath: /images/profiles/paris-2024/aHearn.jpg
+- photoRelPath: /images/profiles/speakers/aHearn.jpg
- job: Sofware Engineer @ Amazon
#### Links
diff --git a/public/conferences/paris-2024/calculating-funnier.md b/public/conferences/paris-2024/sessions/calculating-funnier.md
similarity index 97%
rename from public/conferences/paris-2024/calculating-funnier.md
rename to public/conferences/paris-2024/sessions/calculating-funnier.md
index a2aaffbb..29712158 100644
--- a/public/conferences/paris-2024/calculating-funnier.md
+++ b/public/conferences/paris-2024/sessions/calculating-funnier.md
@@ -19,7 +19,7 @@ Expr is very simple though, in real life we seldom face such simplistic cases. T
### Regis Kuckaertz
-- photoRelPath: /images/profiles/paris-2024/rKuckaertz.webp
+- photoRelPath: /images/profiles/speakers/rKuckaertz.webp
- job: Principal Engineer @ Pirum
#### Links
diff --git a/public/conferences/paris-2024/computer-algebra-scala.md b/public/conferences/paris-2024/sessions/computer-algebra-scala.md
similarity index 95%
rename from public/conferences/paris-2024/computer-algebra-scala.md
rename to public/conferences/paris-2024/sessions/computer-algebra-scala.md
index 6462b6f2..0df9d7fc 100644
--- a/public/conferences/paris-2024/computer-algebra-scala.md
+++ b/public/conferences/paris-2024/sessions/computer-algebra-scala.md
@@ -15,7 +15,7 @@ The Scala Algebra System (ScAS) is a research project devised to explore how one
### Raphaël Jolly
-- photoRelPath: /images/profiles/paris-2024/rJolly.webp
+- photoRelPath: /images/profiles/speakers/rJolly.webp
- job: Software Engineer
#### Links
diff --git a/public/conferences/paris-2024/contextual-abstraction-scala3.md b/public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md
similarity index 97%
rename from public/conferences/paris-2024/contextual-abstraction-scala3.md
rename to public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md
index 1632ff92..f6719253 100644
--- a/public/conferences/paris-2024/contextual-abstraction-scala3.md
+++ b/public/conferences/paris-2024/sessions/contextual-abstraction-scala3.md
@@ -15,7 +15,7 @@ Have you ever been confused by implicits in Scala? I most certainly have. I stru
### Magda Stożek
-- photoRelPath: /images/profiles/paris-2024/mStozek.webp
+- photoRelPath: /images/profiles/speakers/mStozek.webp
- job: Senior Scala engineer @ SoftwareMill
#### Links
diff --git a/public/conferences/paris-2024/decision4s.md b/public/conferences/paris-2024/sessions/decision4s.md
similarity index 95%
rename from public/conferences/paris-2024/decision4s.md
rename to public/conferences/paris-2024/sessions/decision4s.md
index 8a501dfb..c52b04e3 100644
--- a/public/conferences/paris-2024/decision4s.md
+++ b/public/conferences/paris-2024/sessions/decision4s.md
@@ -15,7 +15,7 @@ Higher-kinded data is a specialised application of higher-kinded types. It allow
### Wojciech Pituła
-- photoRelPath: /images/profiles/paris-2024/vPitula.webp
+- photoRelPath: /images/profiles/speakers/vPitula.webp
- job: Staff Engineer @ SwissBorg
#### Links
diff --git a/public/conferences/paris-2024/escaping-false-dichotomy.md b/public/conferences/paris-2024/sessions/escaping-false-dichotomy.md
similarity index 95%
rename from public/conferences/paris-2024/escaping-false-dichotomy.md
rename to public/conferences/paris-2024/sessions/escaping-false-dichotomy.md
index f544c0c4..29bf8407 100644
--- a/public/conferences/paris-2024/escaping-false-dichotomy.md
+++ b/public/conferences/paris-2024/sessions/escaping-false-dichotomy.md
@@ -15,7 +15,7 @@ Are you using one of many type-class based libraries in Scala? Have you ever bee
### Mateusz Kubuszok
-- photoRelPath: /images/profiles/paris-2024/mKubuszok.webp
+- photoRelPath: /images/profiles/speakers/mKubuszok.webp
- job: Senior Scala Developer @ Self-Employed
#### Links
diff --git a/public/conferences/paris-2024/fast-scala-web-workshop.md b/public/conferences/paris-2024/sessions/fast-scala-web-workshop.md
similarity index 95%
rename from public/conferences/paris-2024/fast-scala-web-workshop.md
rename to public/conferences/paris-2024/sessions/fast-scala-web-workshop.md
index 7db50d58..7a268eef 100644
--- a/public/conferences/paris-2024/fast-scala-web-workshop.md
+++ b/public/conferences/paris-2024/sessions/fast-scala-web-workshop.md
@@ -19,7 +19,7 @@ In this workshop we will introduce you to the FastScala framework, it's installa
### David Miguel Antunes
-- photoRelPath: /images/profiles/paris-2024/dAntunes.webp
+- photoRelPath: /images/profiles/speakers/dAntunes.webp
- job: Scala Developer & founder @ Scala Academy
#### Links
diff --git a/public/conferences/paris-2024/fast-scala-web.md b/public/conferences/paris-2024/sessions/fast-scala-web.md
similarity index 95%
rename from public/conferences/paris-2024/fast-scala-web.md
rename to public/conferences/paris-2024/sessions/fast-scala-web.md
index de922884..24fcf6f8 100644
--- a/public/conferences/paris-2024/fast-scala-web.md
+++ b/public/conferences/paris-2024/sessions/fast-scala-web.md
@@ -15,7 +15,7 @@ The FastScala web framework is based on anonymous and secure callbacks from the
### David Miguel Antunes
-- photoRelPath: /images/profiles/paris-2024/dAntunes.webp
+- photoRelPath: /images/profiles/speakers/dAntunes.webp
- job: Scala Developer & founder @ Scala Academy
#### Links
diff --git a/public/conferences/paris-2024/full-stack-scala.md b/public/conferences/paris-2024/sessions/full-stack-scala.md
similarity index 92%
rename from public/conferences/paris-2024/full-stack-scala.md
rename to public/conferences/paris-2024/sessions/full-stack-scala.md
index c84c1b3f..b6226a3a 100644
--- a/public/conferences/paris-2024/full-stack-scala.md
+++ b/public/conferences/paris-2024/sessions/full-stack-scala.md
@@ -17,7 +17,7 @@ All set up in 10 seconds.
### Olivier Nouguier
-- photoRelPath: /images/profiles/paris-2024/oNouguier.webp
+- photoRelPath: /images/profiles/speakers/oNouguier.webp
- job: Software Engineer @ Ledger
#### Links
diff --git a/public/conferences/paris-2024/how-functional-is-direct-style.md b/public/conferences/paris-2024/sessions/how-functional-is-direct-style.md
similarity index 96%
rename from public/conferences/paris-2024/how-functional-is-direct-style.md
rename to public/conferences/paris-2024/sessions/how-functional-is-direct-style.md
index edddd4fb..eca30df5 100644
--- a/public/conferences/paris-2024/how-functional-is-direct-style.md
+++ b/public/conferences/paris-2024/sessions/how-functional-is-direct-style.md
@@ -19,7 +19,7 @@ We’ll investigate what functional programming is at its core, how it relates t
### Adam Warski
-- photoRelPath: /images/profiles/paris-2024/aWarski.webp
+- photoRelPath: /images/profiles/speakers/aWarski.webp
- job: Co-founder @ SoftwareMill
#### Links
diff --git a/public/conferences/paris-2024/keynote-nicolas.md b/public/conferences/paris-2024/sessions/keynote-nicolas.md
similarity index 96%
rename from public/conferences/paris-2024/keynote-nicolas.md
rename to public/conferences/paris-2024/sessions/keynote-nicolas.md
index 4577da37..48b347fb 100644
--- a/public/conferences/paris-2024/keynote-nicolas.md
+++ b/public/conferences/paris-2024/sessions/keynote-nicolas.md
@@ -17,7 +17,7 @@ In this talk, I will show you how to create a programming language from scratch
### Nicolas Rinaudo
-- photoRelPath: /images/profiles/paris-2024/nRinaudo.jpeg
+- photoRelPath: /images/profiles/speakers/nRinaudo.jpeg
- job: VP of Engineering @ J.P. Morgan
#### Links
diff --git a/public/conferences/paris-2024/keynote-valentin.md b/public/conferences/paris-2024/sessions/keynote-valentin.md
similarity index 95%
rename from public/conferences/paris-2024/keynote-valentin.md
rename to public/conferences/paris-2024/sessions/keynote-valentin.md
index d8966744..de59472b 100644
--- a/public/conferences/paris-2024/keynote-valentin.md
+++ b/public/conferences/paris-2024/sessions/keynote-valentin.md
@@ -19,7 +19,7 @@ Bring your heart, and maybe a notebook.
### Valentin Kasas
-- photoRelPath: /images/profiles/paris-2024/vKasas.jpeg
+- photoRelPath: /images/profiles/speakers/vKasas.jpeg
- job: Scala Lover
#### Links
diff --git a/public/conferences/paris-2024/metaprogramming-in-scala3.md b/public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md
similarity index 96%
rename from public/conferences/paris-2024/metaprogramming-in-scala3.md
rename to public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md
index 425f7644..c575e93b 100644
--- a/public/conferences/paris-2024/metaprogramming-in-scala3.md
+++ b/public/conferences/paris-2024/sessions/metaprogramming-in-scala3.md
@@ -29,7 +29,7 @@ In short, we’ll be exploring the compile-time arsenal that Scala 3 gives us wi
### Aleksander Rainko
-- photoRelPath: /images/profiles/paris-2024/aRainko.webp
+- photoRelPath: /images/profiles/speakers/aRainko.webp
- job: Scala Developer @ Scalac
#### Links
diff --git a/public/conferences/paris-2024/mill-builds-scala3.md b/public/conferences/paris-2024/sessions/mill-builds-scala3.md
similarity index 94%
rename from public/conferences/paris-2024/mill-builds-scala3.md
rename to public/conferences/paris-2024/sessions/mill-builds-scala3.md
index 0b056591..d555cd9b 100644
--- a/public/conferences/paris-2024/mill-builds-scala3.md
+++ b/public/conferences/paris-2024/sessions/mill-builds-scala3.md
@@ -15,7 +15,7 @@ Mill is a popular build tool used in Scala projects, where build definitions are
### Jamie Thompson
-- photoRelPath: /images/profiles/paris-2024/jThompson.webp
+- photoRelPath: /images/profiles/speakers/jThompson.webp
- job: Scala 3 compiler contributor
#### Links
diff --git a/public/conferences/paris-2024/optimize-kafka-to-bq.md b/public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md
similarity index 96%
rename from public/conferences/paris-2024/optimize-kafka-to-bq.md
rename to public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md
index 0ac8a327..83312698 100644
--- a/public/conferences/paris-2024/optimize-kafka-to-bq.md
+++ b/public/conferences/paris-2024/sessions/optimize-kafka-to-bq.md
@@ -15,7 +15,7 @@ I will explore how our team developed a custom solution to address the escalatin
### Dario Amorosi
-- photoRelPath: /images/profiles/paris-2024/dAmorosi.webp
+- photoRelPath: /images/profiles/speakers/dAmorosi.webp
- job: Big Data Engineer @ Adevinta
#### Links
diff --git a/public/conferences/paris-2024/plowing-postgres.md b/public/conferences/paris-2024/sessions/plowing-postgres.md
similarity index 95%
rename from public/conferences/paris-2024/plowing-postgres.md
rename to public/conferences/paris-2024/sessions/plowing-postgres.md
index 4fae787a..a77c0fe6 100644
--- a/public/conferences/paris-2024/plowing-postgres.md
+++ b/public/conferences/paris-2024/sessions/plowing-postgres.md
@@ -21,7 +21,7 @@ Join to learn more about applying functional principle to schema modeling and ha
### Valentin Bergeron
-- photoRelPath: /images/profiles/paris-2024/vBergeron.webp
+- photoRelPath: /images/profiles/speakers/vBergeron.webp
- job: Engineering team lead @ Ledger
- confirmed: true
diff --git a/public/conferences/paris-2024/profunctor.md b/public/conferences/paris-2024/sessions/profunctor.md
similarity index 92%
rename from public/conferences/paris-2024/profunctor.md
rename to public/conferences/paris-2024/sessions/profunctor.md
index 27f17e35..9c1f9f08 100644
--- a/public/conferences/paris-2024/profunctor.md
+++ b/public/conferences/paris-2024/sessions/profunctor.md
@@ -15,7 +15,7 @@ Surprise 👀
### Xavier Van de Woestyne
-- photoRelPath: /images/profiles/paris-2024/xVanDeWoestyne.webp
+- photoRelPath: /images/profiles/speakers/xVanDeWoestyne.webp
- job: OCaml Software Engineering at Tarides
#### Links
diff --git a/public/conferences/paris-2024/publish-to-maven.md b/public/conferences/paris-2024/sessions/publish-to-maven.md
similarity index 98%
rename from public/conferences/paris-2024/publish-to-maven.md
rename to public/conferences/paris-2024/sessions/publish-to-maven.md
index ef9e475b..0c0b610d 100644
--- a/public/conferences/paris-2024/publish-to-maven.md
+++ b/public/conferences/paris-2024/sessions/publish-to-maven.md
@@ -21,7 +21,7 @@ This talk will show how the Guardian’s new GitHub Action release workflow make
### Roberto Tyley
-- photoRelPath: /images/profiles/paris-2024/rTyley.webp
+- photoRelPath: /images/profiles/speakers/rTyley.webp
- job: Principal Engineer @ The Guardian
#### Links
diff --git a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md b/public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md
similarity index 98%
rename from public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md
rename to public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md
index ecf23471..5a66cc93 100644
--- a/public/conferences/paris-2024/regular-pattern-heterogeneous-sequences.md
+++ b/public/conferences/paris-2024/sessions/regular-pattern-heterogeneous-sequences.md
@@ -43,7 +43,7 @@ The project is available [here](https://github.com/jimka2001/scala-rte)
### Jim Newton
-- photoRelPath: /images/profiles/paris-2024/jim.webp
+- photoRelPath: /images/profiles/speakers/jim.webp
- job: Teacher & Researcher @ EPITA
#### Links
diff --git a/public/conferences/paris-2024/scala-2-7-7.md b/public/conferences/paris-2024/sessions/scala-2-7-7.md
similarity index 95%
rename from public/conferences/paris-2024/scala-2-7-7.md
rename to public/conferences/paris-2024/sessions/scala-2-7-7.md
index 7fd1d1f1..ecd7b396 100644
--- a/public/conferences/paris-2024/scala-2-7-7.md
+++ b/public/conferences/paris-2024/sessions/scala-2-7-7.md
@@ -19,7 +19,7 @@ It is expected that many people from the audience get surprised about the sbt pr
### Alexis Hernandez
-- photoRelPath: /images/profiles/paris-2024/aHernandez.webp
+- photoRelPath: /images/profiles/speakers/aHernandez.webp
- job: Principal Scala Consultant @ wiringbits
#### Links
diff --git a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md b/public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md
similarity index 97%
rename from public/conferences/paris-2024/scala-pattern-matching-for-dsl.md
rename to public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md
index f50650ea..ee9efd74 100644
--- a/public/conferences/paris-2024/scala-pattern-matching-for-dsl.md
+++ b/public/conferences/paris-2024/sessions/scala-pattern-matching-for-dsl.md
@@ -21,7 +21,7 @@ The technique is used in the Libretto project for pattern matching on domain-lev
### Tomas Mikula
-- photoRelPath: /images/profiles/paris-2024/tMikula.webp
+- photoRelPath: /images/profiles/speakers/tMikula.webp
- job: Lead Scala developer
#### Links
diff --git a/public/conferences/paris-2024/tools-scala-startup.md b/public/conferences/paris-2024/sessions/tools-scala-startup.md
similarity index 96%
rename from public/conferences/paris-2024/tools-scala-startup.md
rename to public/conferences/paris-2024/sessions/tools-scala-startup.md
index 830725a2..6ab90a90 100644
--- a/public/conferences/paris-2024/tools-scala-startup.md
+++ b/public/conferences/paris-2024/sessions/tools-scala-startup.md
@@ -26,7 +26,7 @@ I will share
### Daniel Ciocîrlan
-- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp
+- photoRelPath: /images/profiles/speakers/dCiocirlan.webp
- job: Software Engineer & instructor @ Rock the JVM
#### Links
diff --git a/public/conferences/paris-2024/tools-scala-workshop.md b/public/conferences/paris-2024/sessions/tools-scala-workshop.md
similarity index 96%
rename from public/conferences/paris-2024/tools-scala-workshop.md
rename to public/conferences/paris-2024/sessions/tools-scala-workshop.md
index dd972cf6..fa059c6a 100644
--- a/public/conferences/paris-2024/tools-scala-workshop.md
+++ b/public/conferences/paris-2024/sessions/tools-scala-workshop.md
@@ -19,7 +19,7 @@ This hands-on workshop will teach you the essential skills and toolkit to launch
### Daniel Ciocîrlan
-- photoRelPath: /images/profiles/paris-2024/dCiocirlan.webp
+- photoRelPath: /images/profiles/speakers/dCiocirlan.webp
- job: Software Engineer & instructor @ Rock the JVM
#### Links
diff --git a/public/conferences/paris-2024/web-dev-with-scala.md b/public/conferences/paris-2024/sessions/web-dev-with-scala.md
similarity index 97%
rename from public/conferences/paris-2024/web-dev-with-scala.md
rename to public/conferences/paris-2024/sessions/web-dev-with-scala.md
index 710a632b..ffeb4727 100644
--- a/public/conferences/paris-2024/web-dev-with-scala.md
+++ b/public/conferences/paris-2024/sessions/web-dev-with-scala.md
@@ -19,7 +19,7 @@ A case study on creating a library management system for the Franco-Ukrainian To
### Olya Mazhara
-- photoRelPath: /images/profiles/paris-2024/oMazhara.webp
+- photoRelPath: /images/profiles/speakers/oMazhara.webp
- job: Software Engineer @ Intellias
#### Links
diff --git a/public/conferences/paris-2024/when-to-betray-fp-principles.md b/public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md
similarity index 96%
rename from public/conferences/paris-2024/when-to-betray-fp-principles.md
rename to public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md
index 7ad9af76..7d3f8e04 100644
--- a/public/conferences/paris-2024/when-to-betray-fp-principles.md
+++ b/public/conferences/paris-2024/sessions/when-to-betray-fp-principles.md
@@ -17,7 +17,7 @@ Of course, I’ll bring a few benchmarks to show the differences. And while we
### Gaël Renoux
-- photoRelPath: /images/profiles/paris-2024/gRenoux.webp
+- photoRelPath: /images/profiles/speakers/gRenoux.webp
- job: Staff Engineer @ DataDome
#### Links
diff --git a/public/conferences/paris-2024/zero-to-prod-with-pillars.md b/public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md
similarity index 98%
rename from public/conferences/paris-2024/zero-to-prod-with-pillars.md
rename to public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md
index c0038d26..713a76ae 100644
--- a/public/conferences/paris-2024/zero-to-prod-with-pillars.md
+++ b/public/conferences/paris-2024/sessions/zero-to-prod-with-pillars.md
@@ -25,7 +25,7 @@ Whether you’re a seasoned Scala developer or just getting started, this sessio
### Raphaël Lemaitre
-- photoRelPath: /images/profiles/paris-2024/rLemaitre.webp
+- photoRelPath: /images/profiles/speakers/rLemaitre.webp
- job: Senior Staff Engineer @ Ledger
#### Links
diff --git a/public/conferences/paris-2024/zk-voting-scala-rust.md b/public/conferences/paris-2024/sessions/zk-voting-scala-rust.md
similarity index 96%
rename from public/conferences/paris-2024/zk-voting-scala-rust.md
rename to public/conferences/paris-2024/sessions/zk-voting-scala-rust.md
index b7feca5a..b398a562 100644
--- a/public/conferences/paris-2024/zk-voting-scala-rust.md
+++ b/public/conferences/paris-2024/sessions/zk-voting-scala-rust.md
@@ -17,7 +17,7 @@ I’ll start by presenting the challenges of anonymous electronic voting and the
### Christophe Calvès
-- photoRelPath: /images/profiles/paris-2024/cCalves.webp
+- photoRelPath: /images/profiles/speakers/cCalves.webp
- job: Data Architect @ Ledger
#### Links
diff --git a/public/sponsors/paris-2024.md b/public/conferences/paris-2024/sponsors.md
similarity index 100%
rename from public/sponsors/paris-2024.md
rename to public/conferences/paris-2024/sponsors.md
diff --git a/public/images/orgas/jWinandy.webp b/public/images/profiles/orgas/jWinandy.webp
similarity index 100%
rename from public/images/orgas/jWinandy.webp
rename to public/images/profiles/orgas/jWinandy.webp
diff --git a/public/images/orgas/jbKaiser.webp b/public/images/profiles/orgas/jbKaiser.webp
similarity index 100%
rename from public/images/orgas/jbKaiser.webp
rename to public/images/profiles/orgas/jbKaiser.webp
diff --git a/public/images/orgas/lNouguier.webp b/public/images/profiles/orgas/lNouguier.webp
similarity index 100%
rename from public/images/orgas/lNouguier.webp
rename to public/images/profiles/orgas/lNouguier.webp
diff --git a/public/images/orgas/mKarassev.webp b/public/images/profiles/orgas/mKarassev.webp
similarity index 100%
rename from public/images/orgas/mKarassev.webp
rename to public/images/profiles/orgas/mKarassev.webp
diff --git a/public/images/orgas/qAdam.webp b/public/images/profiles/orgas/qAdam.webp
similarity index 100%
rename from public/images/orgas/qAdam.webp
rename to public/images/profiles/orgas/qAdam.webp
diff --git a/public/images/orgas/wRadji.webp b/public/images/profiles/orgas/wRadji.webp
similarity index 100%
rename from public/images/orgas/wRadji.webp
rename to public/images/profiles/orgas/wRadji.webp
diff --git a/public/images/profiles/paris-2024/aWarski.webp b/public/images/profiles/paris-2024/aWarski.webp
deleted file mode 100644
index c8f48eaa..00000000
Binary files a/public/images/profiles/paris-2024/aWarski.webp and /dev/null differ
diff --git a/public/images/profiles/paris-2024/jim.webp b/public/images/profiles/paris-2024/jim.webp
deleted file mode 100644
index 059ff65d..00000000
Binary files a/public/images/profiles/paris-2024/jim.webp and /dev/null differ
diff --git a/public/images/profiles/paris-2024/oMazhara.webp b/public/images/profiles/paris-2024/oMazhara.webp
deleted file mode 100644
index 2d03baa0..00000000
Binary files a/public/images/profiles/paris-2024/oMazhara.webp and /dev/null differ
diff --git a/public/images/profiles/paris-2024/rLemaitre.webp b/public/images/profiles/paris-2024/rLemaitre.webp
deleted file mode 100644
index 683623c3..00000000
Binary files a/public/images/profiles/paris-2024/rLemaitre.webp and /dev/null differ
diff --git a/public/images/profiles/paris-2024/vBergeron.webp b/public/images/profiles/paris-2024/vBergeron.webp
deleted file mode 100644
index aeac0d3b..00000000
Binary files a/public/images/profiles/paris-2024/vBergeron.webp and /dev/null differ
diff --git a/public/images/profiles/nantes-2024/aBlondeau.webp b/public/images/profiles/speakers/aBlondeau.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/aBlondeau.webp
rename to public/images/profiles/speakers/aBlondeau.webp
diff --git a/public/images/profiles/nantes-2024/aCros.webp b/public/images/profiles/speakers/aCros.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/aCros.webp
rename to public/images/profiles/speakers/aCros.webp
diff --git a/public/images/profiles/paris-2024/aHearn.jpg b/public/images/profiles/speakers/aHearn.jpg
similarity index 100%
rename from public/images/profiles/paris-2024/aHearn.jpg
rename to public/images/profiles/speakers/aHearn.jpg
diff --git a/public/images/profiles/paris-2024/aHernandez.webp b/public/images/profiles/speakers/aHernandez.webp
similarity index 100%
rename from public/images/profiles/paris-2024/aHernandez.webp
rename to public/images/profiles/speakers/aHernandez.webp
diff --git a/public/images/profiles/paris-2024/aRainko.webp b/public/images/profiles/speakers/aRainko.webp
similarity index 100%
rename from public/images/profiles/paris-2024/aRainko.webp
rename to public/images/profiles/speakers/aRainko.webp
diff --git a/public/images/profiles/nantes-2024/aWarski.webp b/public/images/profiles/speakers/aWarski.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/aWarski.webp
rename to public/images/profiles/speakers/aWarski.webp
diff --git a/public/images/profiles/nantes-2024/bJaglin.webp b/public/images/profiles/speakers/bJaglin.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/bJaglin.webp
rename to public/images/profiles/speakers/bJaglin.webp
diff --git a/public/images/profiles/paris-2024/cCalves.webp b/public/images/profiles/speakers/cCalves.webp
similarity index 100%
rename from public/images/profiles/paris-2024/cCalves.webp
rename to public/images/profiles/speakers/cCalves.webp
diff --git a/public/images/profiles/paris-2024/dAmorosi.webp b/public/images/profiles/speakers/dAmorosi.webp
similarity index 100%
rename from public/images/profiles/paris-2024/dAmorosi.webp
rename to public/images/profiles/speakers/dAmorosi.webp
diff --git a/public/images/profiles/paris-2024/dAntunes.webp b/public/images/profiles/speakers/dAntunes.webp
similarity index 100%
rename from public/images/profiles/paris-2024/dAntunes.webp
rename to public/images/profiles/speakers/dAntunes.webp
diff --git a/public/images/profiles/paris-2024/dCiocirlan.webp b/public/images/profiles/speakers/dCiocirlan.webp
similarity index 100%
rename from public/images/profiles/paris-2024/dCiocirlan.webp
rename to public/images/profiles/speakers/dCiocirlan.webp
diff --git a/public/images/profiles/nantes-2024/dPlaindoux.webp b/public/images/profiles/speakers/dPlaindoux.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/dPlaindoux.webp
rename to public/images/profiles/speakers/dPlaindoux.webp
diff --git a/public/images/profiles/nantes-2024/eCrance.webp b/public/images/profiles/speakers/eCrance.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/eCrance.webp
rename to public/images/profiles/speakers/eCrance.webp
diff --git a/public/images/profiles/nantes-2024/fLaroche.webp b/public/images/profiles/speakers/fLaroche.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/fLaroche.webp
rename to public/images/profiles/speakers/fLaroche.webp
diff --git a/public/images/profiles/nantes-2024/fSarradin.webp b/public/images/profiles/speakers/fSarradin.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/fSarradin.webp
rename to public/images/profiles/speakers/fSarradin.webp
diff --git a/public/images/profiles/paris-2024/gRenoux.webp b/public/images/profiles/speakers/gRenoux.webp
similarity index 100%
rename from public/images/profiles/paris-2024/gRenoux.webp
rename to public/images/profiles/speakers/gRenoux.webp
diff --git a/public/images/profiles/paris-2024/jThompson.webp b/public/images/profiles/speakers/jThompson.webp
similarity index 100%
rename from public/images/profiles/paris-2024/jThompson.webp
rename to public/images/profiles/speakers/jThompson.webp
diff --git a/public/images/profiles/nantes-2024/jVauchel.webp b/public/images/profiles/speakers/jVauchel.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/jVauchel.webp
rename to public/images/profiles/speakers/jVauchel.webp
diff --git a/public/images/profiles/nantes-2024/jbKaiser.webp b/public/images/profiles/speakers/jbKaiser.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/jbKaiser.webp
rename to public/images/profiles/speakers/jbKaiser.webp
diff --git a/public/images/profiles/nantes-2024/jim.webp b/public/images/profiles/speakers/jim.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/jim.webp
rename to public/images/profiles/speakers/jim.webp
diff --git a/public/images/profiles/paris-2024/kKalra.webp b/public/images/profiles/speakers/kKalra.webp
similarity index 100%
rename from public/images/profiles/paris-2024/kKalra.webp
rename to public/images/profiles/speakers/kKalra.webp
diff --git a/public/images/profiles/nantes-2024/lBialy.webp b/public/images/profiles/speakers/lBialy.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/lBialy.webp
rename to public/images/profiles/speakers/lBialy.webp
diff --git a/public/images/profiles/paris-2024/lHaoyi.webp b/public/images/profiles/speakers/lHaoyi.webp
similarity index 100%
rename from public/images/profiles/paris-2024/lHaoyi.webp
rename to public/images/profiles/speakers/lHaoyi.webp
diff --git a/public/images/profiles/nantes-2024/mBaechler.webp b/public/images/profiles/speakers/mBaechler.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/mBaechler.webp
rename to public/images/profiles/speakers/mBaechler.webp
diff --git a/public/images/profiles/paris-2024/mKubuszok.webp b/public/images/profiles/speakers/mKubuszok.webp
similarity index 100%
rename from public/images/profiles/paris-2024/mKubuszok.webp
rename to public/images/profiles/speakers/mKubuszok.webp
diff --git a/public/images/profiles/nantes-2024/mMcGuigan.webp b/public/images/profiles/speakers/mMcGuigan.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/mMcGuigan.webp
rename to public/images/profiles/speakers/mMcGuigan.webp
diff --git a/public/images/profiles/nantes-2024/mRebiai.webp b/public/images/profiles/speakers/mRebiai.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/mRebiai.webp
rename to public/images/profiles/speakers/mRebiai.webp
diff --git a/public/images/profiles/paris-2024/mStozek.webp b/public/images/profiles/speakers/mStozek.webp
similarity index 100%
rename from public/images/profiles/paris-2024/mStozek.webp
rename to public/images/profiles/speakers/mStozek.webp
diff --git a/public/images/profiles/paris-2024/nRinaudo.jpeg b/public/images/profiles/speakers/nRinaudo.jpeg
similarity index 100%
rename from public/images/profiles/paris-2024/nRinaudo.jpeg
rename to public/images/profiles/speakers/nRinaudo.jpeg
diff --git a/public/images/profiles/nantes-2024/oMazhara.webp b/public/images/profiles/speakers/oMazhara.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/oMazhara.webp
rename to public/images/profiles/speakers/oMazhara.webp
diff --git a/public/images/profiles/nantes-2024/oMelois.webp b/public/images/profiles/speakers/oMelois.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/oMelois.webp
rename to public/images/profiles/speakers/oMelois.webp
diff --git a/public/images/profiles/paris-2024/oNouguier.webp b/public/images/profiles/speakers/oNouguier.webp
similarity index 100%
rename from public/images/profiles/paris-2024/oNouguier.webp
rename to public/images/profiles/speakers/oNouguier.webp
diff --git a/public/images/profiles/nantes-2024/pMatthews.webp b/public/images/profiles/speakers/pMatthews.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/pMatthews.webp
rename to public/images/profiles/speakers/pMatthews.webp
diff --git a/public/images/profiles/nantes-2024/rClaude.webp b/public/images/profiles/speakers/rClaude.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/rClaude.webp
rename to public/images/profiles/speakers/rClaude.webp
diff --git a/public/images/profiles/paris-2024/rJolly.webp b/public/images/profiles/speakers/rJolly.webp
similarity index 100%
rename from public/images/profiles/paris-2024/rJolly.webp
rename to public/images/profiles/speakers/rJolly.webp
diff --git a/public/images/profiles/paris-2024/rKuckaertz.webp b/public/images/profiles/speakers/rKuckaertz.webp
similarity index 100%
rename from public/images/profiles/paris-2024/rKuckaertz.webp
rename to public/images/profiles/speakers/rKuckaertz.webp
diff --git a/public/images/profiles/nantes-2024/rLemaitre.webp b/public/images/profiles/speakers/rLemaitre.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/rLemaitre.webp
rename to public/images/profiles/speakers/rLemaitre.webp
diff --git a/public/images/profiles/paris-2024/rTyley.webp b/public/images/profiles/speakers/rTyley.webp
similarity index 100%
rename from public/images/profiles/paris-2024/rTyley.webp
rename to public/images/profiles/speakers/rTyley.webp
diff --git a/public/images/profiles/nantes-2024/sBernard.webp b/public/images/profiles/speakers/sBernard.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/sBernard.webp
rename to public/images/profiles/speakers/sBernard.webp
diff --git a/public/images/profiles/nantes-2024/sCollard.webp b/public/images/profiles/speakers/sCollard.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/sCollard.webp
rename to public/images/profiles/speakers/sCollard.webp
diff --git a/public/images/profiles/paris-2024/tMikula.webp b/public/images/profiles/speakers/tMikula.webp
similarity index 100%
rename from public/images/profiles/paris-2024/tMikula.webp
rename to public/images/profiles/speakers/tMikula.webp
diff --git a/public/images/profiles/nantes-2024/toli.webp b/public/images/profiles/speakers/toli.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/toli.webp
rename to public/images/profiles/speakers/toli.webp
diff --git a/public/images/profiles/nantes-2024/uli.webp b/public/images/profiles/speakers/uli.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/uli.webp
rename to public/images/profiles/speakers/uli.webp
diff --git a/public/images/profiles/nantes-2024/vBergeron.webp b/public/images/profiles/speakers/vBergeron.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/vBergeron.webp
rename to public/images/profiles/speakers/vBergeron.webp
diff --git a/public/images/profiles/paris-2024/vKasas.jpeg b/public/images/profiles/speakers/vKasas.jpeg
similarity index 100%
rename from public/images/profiles/paris-2024/vKasas.jpeg
rename to public/images/profiles/speakers/vKasas.jpeg
diff --git a/public/images/profiles/paris-2024/vPitula.webp b/public/images/profiles/speakers/vPitula.webp
similarity index 100%
rename from public/images/profiles/paris-2024/vPitula.webp
rename to public/images/profiles/speakers/vPitula.webp
diff --git a/public/images/profiles/paris-2024/xVanDeWoestyne.webp b/public/images/profiles/speakers/xVanDeWoestyne.webp
similarity index 100%
rename from public/images/profiles/paris-2024/xVanDeWoestyne.webp
rename to public/images/profiles/speakers/xVanDeWoestyne.webp
diff --git a/public/images/profiles/nantes-2024/xVdW.webp b/public/images/profiles/speakers/xVdW.webp
similarity index 100%
rename from public/images/profiles/nantes-2024/xVdW.webp
rename to public/images/profiles/speakers/xVdW.webp
diff --git a/public/favicon.ico b/public/logos/favicon.ico
similarity index 100%
rename from public/favicon.ico
rename to public/logos/favicon.ico
diff --git a/public/scalaio-opengraph.webp b/public/logos/scalaio-opengraph.webp
similarity index 100%
rename from public/scalaio-opengraph.webp
rename to public/logos/scalaio-opengraph.webp
diff --git a/public/scalaio.svg b/public/logos/scalaio.svg
similarity index 100%
rename from public/scalaio.svg
rename to public/logos/scalaio.svg
diff --git a/public/scalaio_black.svg b/public/logos/scalaio_black.svg
similarity index 100%
rename from public/scalaio_black.svg
rename to public/logos/scalaio_black.svg
diff --git a/src/main/scala/io/scala/Page.scala b/src/main/scala/io/scala/Page.scala
index f4cb7af9..6dd30207 100644
--- a/src/main/scala/io/scala/Page.scala
+++ b/src/main/scala/io/scala/Page.scala
@@ -13,13 +13,14 @@ import urldsl.errors.DummyError
import urldsl.vocabulary.FromString
import urldsl.vocabulary.Printer
+import io.scala.data.Event
import io.scala.views.*
import io.scala.views.IndexView
sealed trait Draftable:
def withDraft: Option[Boolean]
sealed trait Routeable:
- def conference: Option[String]
+ def conference: Option[Event]
object Routeable:
def fallback: String = "paris-2024"
@@ -28,19 +29,19 @@ sealed trait Slugify:
sealed trait Page:
def title: String
-case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[String] = None)
+case class IndexPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None)
extends Page
with Draftable
with Routeable:
def title: String = "Home"
-case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[String] = None)
+case class SessionsPage(withDraft: Option[Boolean] = None, conference: Option[Event] = None)
extends Page
with Draftable
with Routeable:
def title: String = "Sessions"
-case class SessionPage(conference: String, slug: String) extends Page with Slugify:
+case class SessionPage(conference: Event, slug: String) extends Page with Slugify:
def title: String = s"Session - $slug"
-case class SponsorsPage(conference: Option[String] = None) extends Page with Routeable:
+case class SponsorsPage(conference: Option[Event] = None) extends Page with Routeable:
def title: String = "Sponsors"
case object VenuePage extends Page:
def title: String = "Venue"
@@ -67,7 +68,7 @@ object Page {
given pageArgBasicCodec: ReadWriter[Page] = macroRW
val draftParam = param[Boolean]("withDraft").?
- val conferenceParam = param[String]("conference").?
+ val conferenceParam = param[Event]("conference").?
given FromString[Page, DummyError] = {
case "sessions" => Right(SessionsPage())
@@ -92,12 +93,12 @@ object Page {
case _: IndexPage => ""
}
- val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[String])](
+ val indexRoute = Route.onlyQuery[IndexPage, (Option[Boolean], Option[Event])](
encode = x => (x.withDraft, x.conference),
decode = IndexPage(_, _),
(root / endOfSegments) ? draftParam & conferenceParam
)
- val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[String])](
+ val sessionsRoute = Route.onlyQuery[SessionsPage, (Option[Boolean], Option[Event])](
encode = x => (x.withDraft, x.conference),
decode = SessionsPage(_, _),
(root / "sessions" / endOfSegments) ? draftParam & conferenceParam
@@ -108,27 +109,27 @@ object Page {
decode = SessionsPage(_, _),
(root / "talks" / endOfSegments) ? draftParam & conferenceParam
)
- val sessionRoute = Route[SessionPage, (String, String)](
+ val sessionRoute = Route[SessionPage, (Event, String)](
encode = x => (x.conference, x.slug),
decode = SessionPage(_, _),
- (root / "sessions" / segment[String] / segment[String] / endOfSegments)
+ (root / "sessions" / segment[Event] / segment[String] / endOfSegments)
)
// maintain old /talks// links
- private val legacyTalkRoute = Route(
+ private val legacyTalkRoute = Route[SessionPage, (Event, String)](
encode = (x: SessionPage) => (x.conference, x.slug),
decode = SessionPage(_, _),
- root / "talks" / segment[String] / segment[String] / endOfSegments
+ root / "talks" / segment[Event] / segment[String] / endOfSegments
)
// maintain links of Nantes 2024 edition: scala.io/talks/
private val legacyNantesTalkRoute = Route[SessionPage, String](
encode = x => x.slug,
- decode = SessionPage("nantes-2024", _),
+ decode = SessionPage(Event.`nantes-2024`, _),
root / "talks" / segment[String] / endOfSegments
)
- val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[String]](
+ val sponsorsRoute = Route.onlyQuery[SponsorsPage, Option[Event]](
encode = x => x.conference,
decode = args => SponsorsPage(args),
- (root / "sponsors" / endOfSegments) ? param[String]("conference").?
+ (root / "sponsors" / endOfSegments) ? conferenceParam
)
val venueRoute = Route.static(
VenuePage,
diff --git a/src/main/scala/io/scala/app/faq/FAQView.scala b/src/main/scala/io/scala/app/faq/FAQView.scala
index 09d78d44..0bb2a39e 100644
--- a/src/main/scala/io/scala/app/faq/FAQView.scala
+++ b/src/main/scala/io/scala/app/faq/FAQView.scala
@@ -63,19 +63,6 @@ object FAQView extends SimpleView {
Links.highlighted(href := "https://forms.gle/cVTtNzPF77f4TsJW7", "this form")
)
),
- question(
- "Why 2023-10 was cancelled?",
- p(
- "It was difficult to get sponsorship to close the budget, that's why we had to work on a new format for this edition."
- )
- ),
- question(
- "Why Nantes?",
- p(
- """The conference was in Paris (2013, 2014, 2022) and Lyon (2016, 2017, 2018, 2019).
- |The organisers are in majority familiar with Nantes, Clever Cloud and _icilundi offered to facilitate hosting the event.""".stripMargin
- )
- ),
question(
"Do you reimburse tickets?",
p("We would prefer not to, however you can always send us an email. We always reimbursed tickets if needed.")
@@ -147,7 +134,7 @@ object FAQView extends SimpleView {
github
)
)
- ).withFlexGrow(2)
+ )
)
lazy val speakerQuestions = Containers.flexCards(
diff --git a/src/main/scala/io/scala/app/sessions/SessionList.scala b/src/main/scala/io/scala/app/sessions/SessionList.scala
index 88650b60..e23036e1 100644
--- a/src/main/scala/io/scala/app/sessions/SessionList.scala
+++ b/src/main/scala/io/scala/app/sessions/SessionList.scala
@@ -4,8 +4,8 @@ import com.raquo.laminar.api.L.*
import scala.collection.immutable.Queue
import io.scala.SessionsPage
+import io.scala.data.Event
import io.scala.data.SessionsHistory
-import io.scala.data.SessionsHistory.getConfName
import io.scala.models.Session
import io.scala.modules.SessionCard
import io.scala.modules.elements.*
@@ -17,7 +17,7 @@ case object SessionList extends ReactiveView[SessionsPage] {
given Ordering[(String, List[Session])] =
case ((cat1, talks1), (cat2, talks2)) =>
val sizeComparison = talks1.size.compareTo(talks2.size)
-
+
if sizeComparison != 0 then -sizeComparison
else cat1.compareTo(cat2)
@@ -35,7 +35,7 @@ case object SessionList extends ReactiveView[SessionsPage] {
acc
.enqueue(Titles.medium(category, idAttr := category))
.enqueue(
- Containers.gridCards(talks.sorted.map(SessionCard(_, getConfName(sessionArg.conference))))
+ Containers.gridCards(talks.sorted.map(SessionCard(_, sessionArg.conference.getOrElse(Event.Current))))
)
}
.toSeq
@@ -52,10 +52,12 @@ case object SessionList extends ReactiveView[SessionsPage] {
SessionsHistory.sessionsForConf(arg).partition(_.isWorkshop)
val tabs = Seq(
Session.Kind.Keynote ->
- Containers.gridCards(talksByCategory.filter(_.isKeynote).map(SessionCard(_, getConfName(arg.conference)))),
+ Containers.gridCards(
+ talksByCategory.filter(_.isKeynote).map(SessionCard(_, arg.conference.getOrElse(Event.Current)))
+ ),
Session.Kind.Talk -> tabWithTOC(sortedCategories(talksByCategory.filter(!_.isKeynote)), arg),
Session.Kind.Workshop ->
- Containers.gridCards(workshopsByCategory.map(SessionCard(_, getConfName(arg.conference))))
+ Containers.gridCards(workshopsByCategory.map(SessionCard(_, arg.conference.getOrElse(Event.Current))))
)
Tabs(tabs, h => h.toPlural, Session.Kind.Talk).render
}
diff --git a/src/main/scala/io/scala/app/sessions/SessionView.scala b/src/main/scala/io/scala/app/sessions/SessionView.scala
index d3ac33c8..e0a24b57 100644
--- a/src/main/scala/io/scala/app/sessions/SessionView.scala
+++ b/src/main/scala/io/scala/app/sessions/SessionView.scala
@@ -4,7 +4,6 @@ import com.raquo.laminar.api.L.*
import io.scala.extensions.grayOutIf
import io.scala.SessionPage
-import io.scala.data.SessionsHistory
import io.scala.models.Session
import io.scala.modules.elements.Containers
import io.scala.modules.elements.Paragraphs
@@ -16,9 +15,7 @@ object SessionView extends ReactiveView[SessionPage]:
def body(signal: Signal[SessionPage]): HtmlElement =
val sessionSignal = signal.map: sessionPage =>
- SessionsHistory
- .sessionsForConf(sessionPage.conference)
- .getOrElse(List.empty)
+ sessionPage.conference.sessions
.find(_.info.slug == sessionPage.slug)
.getOrElse(notFoundTalk)
sectionTag(
diff --git a/src/main/scala/io/scala/data/History.scala b/src/main/scala/io/scala/data/History.scala
index e5e4dcda..6cebaae8 100644
--- a/src/main/scala/io/scala/data/History.scala
+++ b/src/main/scala/io/scala/data/History.scala
@@ -1,5 +1,10 @@
package io.scala.data
+import upickle.default.*
+import urldsl.errors.DummyError
+import urldsl.vocabulary.FromString
+import urldsl.vocabulary.Printer
+
import io.scala.Draftable
import io.scala.Routeable
import io.scala.data.parsers.Parsers
@@ -22,32 +27,24 @@ enum Event(val sessions: List[Session], val sponsors: List[Sponsor]):
object Event:
val Current: Event = Event.`paris-2024`
- // makes me want to use enumeratum again...
- def withName(name: String): Option[Event] =
- Event.values.find(_.toString == name)
- def withNameOrCurrent(name: String): Event =
- withName(name).getOrElse(Current)
- def withNameOrCurrent(maybeName: Option[String]): Event =
- maybeName.flatMap(Event.withName).getOrElse(Current)
+
+ given ReadWriter[Event] = macroRW
+ given FromString[Event, DummyError] = {
+ case "paris-2024" => Right(Event.`paris-2024`)
+ case "nantes-2024" => Right(Event.`nantes-2024`)
+ case _ => Left(DummyError.dummyError)
+ }
+
+ given Printer[Event] = {
+ case Event.`paris-2024` => "paris-2024"
+ case Event.`nantes-2024` => "nantes-2024"
+ }
object SessionsHistory:
def sessionsForConf(args: Routeable & Draftable): List[Session] =
- Event
- .withNameOrCurrent(args.conference)
+ args.conference
+ .getOrElse(Event.Current)
.sessions
.filterWhen(args.withDraft.fold(true)(!_))(_.info.confirmed)
- def sessionsForSchedule: List[Session] =
- Event.Current.sessions
-
- def sessionsForConf(confName: String): Option[List[Session]] =
- Event.withName(confName).map(_.sessions)
-
- inline def getConfName(confName: Option[String]): String =
- confName.getOrElse(Event.Current.toString)
-
-object SponsorsHistory:
-
- def sponsorsForConf(confName: Option[String]): List[Sponsor] =
- confName.flatMap(Event.withName).getOrElse(Event.Current).sponsors
diff --git a/src/main/scala/io/scala/data/ScheduleInfo.scala b/src/main/scala/io/scala/data/ScheduleInfo.scala
index abe0e46d..e9c706db 100644
--- a/src/main/scala/io/scala/data/ScheduleInfo.scala
+++ b/src/main/scala/io/scala/data/ScheduleInfo.scala
@@ -22,9 +22,7 @@ object ScheduleInfo {
extension (d: HtmlElement) def gridArea(area: String) = d.amend(styleAttr := s"grid-area: $area")
- lazy val session: String => Session =
- val schedulables = SessionsHistory.sessionsForSchedule
- (slug) => schedulables.find(_.info.slug == slug).getOrElse(Session.empty)
+ def session(slug: String) = Event.Current.sessions.find(_.info.slug == slug).getOrElse(Session.empty)
val day1 = List(
time(9, 30).render(),
@@ -104,5 +102,8 @@ object ScheduleInfo {
Special(Special.Kind.End).render
).zipWithIndex.map { case (x, i) => x.gridArea(s"a${i + 1}") }
- val allDays = Seq((DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")), (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2")))
+ val allDays = Seq(
+ (DayOfWeek.THURSDAY, div(day1, className := "day-base-layout day1")),
+ (DayOfWeek.FRIDAY, div(day2, className := "day-base-layout day2"))
+ )
}
diff --git a/src/main/scala/io/scala/models/Organizer.scala b/src/main/scala/io/scala/models/Organizer.scala
index 6ec2c9c9..983f56a5 100644
--- a/src/main/scala/io/scala/models/Organizer.scala
+++ b/src/main/scala/io/scala/models/Organizer.scala
@@ -10,4 +10,4 @@ final case class Organizer(
socials: List[Social] = List.empty,
representative: Boolean = false
):
- def photoPath = photo.fold(io.scala.profilePlaceholder)(path => s"/images/orgas/$path")
+ def photoPath = photo.fold(io.scala.profilePlaceholder)(path => s"/images/profiles/orgas/$path")
diff --git a/src/main/scala/io/scala/models/Session.scala b/src/main/scala/io/scala/models/Session.scala
index 9b15380c..42db0091 100644
--- a/src/main/scala/io/scala/models/Session.scala
+++ b/src/main/scala/io/scala/models/Session.scala
@@ -34,7 +34,7 @@ case class Session(
Parsers.Description.parseTalk(description).map(Paragraphs.description(_))
def duration: Int = info.kind.duration
- def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current.toString, room)
+ def render(room: Session.Room | Null): Div = SessionCard(this, Event.Current, room)
def isKeynote: Boolean = info.kind == Session.Kind.Keynote
def isWorkshop: Boolean = info.kind == Session.Kind.Workshop
def isBreak: Boolean = false
diff --git a/src/main/scala/io/scala/modules/SessionCard.scala b/src/main/scala/io/scala/modules/SessionCard.scala
index 69bd02d3..b98cb567 100644
--- a/src/main/scala/io/scala/modules/SessionCard.scala
+++ b/src/main/scala/io/scala/modules/SessionCard.scala
@@ -10,6 +10,7 @@ import io.scala.modules.elements.Buttons
import io.scala.modules.elements.Buttons.important
import io.scala.modules.elements.Image
import io.scala.svgs.Icons
+import io.scala.data.Event
object SessionKindTag:
def apply(kind: Session.Kind): Span =
@@ -22,7 +23,7 @@ object SessionCard:
case _ => name
// Remove the dependency on `conference` by having it injected in Session.Basic info for better reusability
- def apply(session: Session, conference: String, room: Session.Room | Null = null): Div =
+ def apply(session: Session, conference: Event, room: Session.Room | Null = null): Div =
def realDuration = session.info.title match
case s if session.duration == 150 && (s.startsWith("Building") || s.startsWith("Quick")) => 90
case _ => session.info.kind.duration
diff --git a/src/main/scala/io/scala/modules/SpeakerCard.scala b/src/main/scala/io/scala/modules/SpeakerCard.scala
index bc132182..2a849ac1 100644
--- a/src/main/scala/io/scala/modules/SpeakerCard.scala
+++ b/src/main/scala/io/scala/modules/SpeakerCard.scala
@@ -3,23 +3,25 @@ package modules
import com.raquo.laminar.api.L.*
import com.raquo.laminar.nodes.ReactiveHtmlElement
+import org.scalajs.dom.HTMLDivElement
+
+import io.scala.data.Event
import io.scala.extensions.grayOutIf
import io.scala.models.Session
import io.scala.models.Session.Speaker
import io.scala.models.Social
import io.scala.modules.elements.Buttons
import io.scala.modules.elements.Buttons.*
-import org.scalajs.dom.HTMLDivElement
import io.scala.modules.elements.Image
object SpeakerCard {
- def apply(speaker: Speaker, talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] =
+ def apply(speaker: Speaker, talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] =
div(
className := "speaker-card",
Image.photo(
- src := speaker.photoRelPath,
- className := "photo",
- alt := s"${speaker.name}'s profile",
+ src := speaker.photoRelPath,
+ className := "photo",
+ alt := s"${speaker.name}'s profile",
loadingAttr := "lazy"
),
div(
@@ -43,7 +45,7 @@ object SpeakerCard {
linksToTalks(talks, conference)
).grayOutIf(talks.forall(_.cancelledReason.isDefined))
- def linksToTalks(talks: List[Session], conference: String): ReactiveHtmlElement[HTMLDivElement] =
+ def linksToTalks(talks: List[Session], conference: Event): ReactiveHtmlElement[HTMLDivElement] =
def linkButton(info: Session.BasicInfo) =
val text = if info.kind == Session.Kind.Workshop then "Workshop" else "Talk"
Buttons
diff --git a/src/main/scala/io/scala/modules/layout/Footer.scala b/src/main/scala/io/scala/modules/layout/Footer.scala
index 3c69fa3c..62f1c7ff 100644
--- a/src/main/scala/io/scala/modules/layout/Footer.scala
+++ b/src/main/scala/io/scala/modules/layout/Footer.scala
@@ -17,6 +17,7 @@ import io.scala.modules.elements.Links
import io.scala.modules.elements.Lists
import io.scala.modules.elements.Titles
import io.scala.svgs.Icons
+import io.scala.data.Event
object Footer {
private lazy val summary: Div =
@@ -56,7 +57,7 @@ object Footer {
Lists.pipes(
ConfsData.all
.map { key =>
- val linkKey = key.replace("_", "-")
+ val linkKey = Event.valueOf(key.replace("_", "-"))
li(
Links
.highlighted(
diff --git a/src/main/scala/io/scala/views/IndexView.scala b/src/main/scala/io/scala/views/IndexView.scala
index 6e275fa0..880271dc 100644
--- a/src/main/scala/io/scala/views/IndexView.scala
+++ b/src/main/scala/io/scala/views/IndexView.scala
@@ -6,11 +6,12 @@ import org.scalajs.dom.document
import io.scala.IndexPage
import io.scala.Page
import io.scala.VenuePage
+import io.scala.data.Event
import io.scala.data.SessionsHistory
import io.scala.extensions.withBinder
+import io.scala.extensions.withLink
import io.scala.modules.SpeakerCard
import io.scala.modules.elements.*
-import io.scala.extensions.withLink
case object IndexView extends ReactiveView[IndexPage] {
@@ -44,7 +45,7 @@ case object IndexView extends ReactiveView[IndexPage] {
.flatMap: talk =>
talk.speakers.map((_, talk))
.groupMap(_._1)(_._2)
- .mapValues(_.distinctBy(_.info.kind).sortBy(_.info.kind))
+ .mapValues(_.sortBy(_.info.kind))
.toSeq
.sortBy(_._1)
@@ -54,7 +55,7 @@ case object IndexView extends ReactiveView[IndexPage] {
div(
className := "card-container",
children <-- args.map: page =>
- speakers(page).map(SpeakerCard(_, _, SessionsHistory.getConfName(page.conference)))
+ speakers(page).map(SpeakerCard(_, _, page.conference.getOrElse(Event.Current)))
)
)
@@ -80,7 +81,9 @@ case object IndexView extends ReactiveView[IndexPage] {
idAttr("tickets"),
className := "container",
Titles("Tickets"),
- p("We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)"),
+ p(
+ "We offer both on-site and online tickets for the conference (redirect to the same page, just for better readability :)"
+ ),
div(
Buttons.shiny("On-site tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita"),
Buttons.shiny("Streaming tickets").withLink("https://www.billetweb.fr/scalaio-paris-2024-epita")
diff --git a/src/main/scala/io/scala/views/SponsorsList.scala b/src/main/scala/io/scala/views/SponsorsList.scala
index b1921167..ba4d2197 100644
--- a/src/main/scala/io/scala/views/SponsorsList.scala
+++ b/src/main/scala/io/scala/views/SponsorsList.scala
@@ -5,7 +5,7 @@ import com.raquo.laminar.nodes.ReactiveHtmlElement
import io.scala.Lexicon
import io.scala.SponsorsPage
-import io.scala.data.SponsorsHistory
+import io.scala.data.Event
import io.scala.modules.elements.*
case object SponsorsList extends ReactiveView[SponsorsPage] {
@@ -30,8 +30,9 @@ case object SponsorsList extends ReactiveView[SponsorsPage] {
div(
className := "container",
children <-- args.map(arg =>
- SponsorsHistory
- .sponsorsForConf(arg.conference)
+ arg.conference
+ .getOrElse(Event.Current)
+ .sponsors
.groupBy(_.rank)
.toSeq
.sortBy(_._1)