diff --git a/Package.swift b/Package.swift
index 4b0cc2c..903fded 100644
--- a/Package.swift
+++ b/Package.swift
@@ -1,4 +1,4 @@
-// swift-tools-version:5.5
+// swift-tools-version:5.10
import PackageDescription
@@ -12,12 +12,14 @@ let package = Package(
)
],
dependencies: [
- .package(name: "Publish", url: "https://github.com/johnsundell/publish.git", from: "0.8.0")
+ .package(url: "https://github.com/johnsundell/publish.git", from: "0.8.0")
],
targets: [
.executableTarget(
name: "Conference",
- dependencies: ["Publish"]
+ dependencies: [
+ .product(name: "Publish", package: "publish")
+ ]
)
]
)
\ No newline at end of file
diff --git a/Resources/App/Images/speakers/daniel-steinberg.png b/Resources/App/Images/speakers/daniel-steinberg.png
new file mode 100644
index 0000000..863e847
Binary files /dev/null and b/Resources/App/Images/speakers/daniel-steinberg.png differ
diff --git a/Resources/App/YearX/images/icons/feather-sprite.svg b/Resources/App/YearX/images/icons/feather-sprite.svg
index 6468bbf..c767553 100644
--- a/Resources/App/YearX/images/icons/feather-sprite.svg
+++ b/Resources/App/YearX/images/icons/feather-sprite.svg
@@ -1 +1,10 @@
-
+
\ No newline at end of file
diff --git a/Resources/App/YearX/images/icons/mastodon.svg b/Resources/App/YearX/images/icons/mastodon.svg
new file mode 100644
index 0000000..5618f0d
--- /dev/null
+++ b/Resources/App/YearX/images/icons/mastodon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Resources/App/YearX/styles/layout.css b/Resources/App/YearX/styles/layout.css
index f5e6253..35f9e01 100644
--- a/Resources/App/YearX/styles/layout.css
+++ b/Resources/App/YearX/styles/layout.css
@@ -20,6 +20,32 @@ body {
fill: none;
}
+.footer {
+ .feather-replacement {
+ filter: invert(100%) sepia(0%) saturate(7483%) hue-rotate(294deg) brightness(101%) contrast(101%);
+ }
+}
+
+.profile {
+ .feather-replacement {
+ filter: invert(47%) sepia(74%) saturate(6012%) hue-rotate(199deg) brightness(100%) contrast(103%);
+ }
+
+ .feather-replacement:hover {
+ filter: invert(20%) sepia(92%) saturate(2263%) hue-rotate(200deg) brightness(91%) contrast(101%);
+ }
+}
+
+.feather-replacement {
+ width: 24px;
+ height: 24px;
+ stroke: currentColor;
+ stroke-width: 2;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ fill: none;
+}
+
/* Icons (Linea Basic) */
@font-face {
font-family: "linea-basic-10";
@@ -163,7 +189,7 @@ a.sales-banner {
text-align: center;
}
-a.sales-banner: hover {
+a.sales-banner:hover {
font-weight: 400;
color: #ffffff;
}
diff --git a/Sources/Conference/Components/SiteFooter.swift b/Sources/Conference/Components/SiteFooter.swift
index 758516a..0dfc569 100644
--- a/Sources/Conference/Components/SiteFooter.swift
+++ b/Sources/Conference/Components/SiteFooter.swift
@@ -15,6 +15,12 @@ struct SiteFooter: Component {
SVG(url: "/App/YearX/images/icons/feather-sprite.svg#github").class("feather text-white")
}.class("icon")
}.linkTarget(.blank)
+ Link(url: "https://hachyderm.io/@swiftserverconf") {
+ Span {
+ Image(url: "/App/YearX/images/icons/mastodon.svg", description: "Mastodon")
+ .class("feather-replacement")
+ }.class("icon")
+ }.linkTarget(.blank)
Link(url: "https://twitter.com/SwiftServerConf") {
Span {
SVG(url: "/App/YearX/images/icons/feather-sprite.svg#twitter").class("feather text-white")
diff --git a/Sources/Conference/Components/SpeakerDetail.swift b/Sources/Conference/Components/SpeakerDetail.swift
index c0aca4b..d07942f 100644
--- a/Sources/Conference/Components/SpeakerDetail.swift
+++ b/Sources/Conference/Components/SpeakerDetail.swift
@@ -33,6 +33,14 @@ struct SpeakerDetail: Component {
}.linkTarget(.blank).class("icon")
}
}
+ if let mastodonURL = speaker.mastodon {
+ Link(url: mastodonURL) {
+ Span {
+ Image(url: "/App/YearX/images/icons/mastodon.svg", description: "Mastodon")
+ .class("feather-replacement")
+ }.linkTarget(.blank).class("icon")
+ }
+ }
}
.class("social-media")
}
@@ -66,8 +74,14 @@ struct SpeakerDetail: Component {
H3("About the Speaker")
Div {
H4("Position").class("f-gradient")
- H6("\(speaker.role) at \(speaker.company)")
- .class("f-weight-300")
+ if let company = speaker.company {
+ H6("\(speaker.role) at \(company)")
+ .class("f-weight-300")
+ } else {
+ H6("\(speaker.role)")
+ .class("f-weight-300")
+
+ }
}
.class("section")
Div {
diff --git a/Sources/Conference/Components/SpeakerList.swift b/Sources/Conference/Components/SpeakerList.swift
index 4a0ffd8..6a259bd 100644
--- a/Sources/Conference/Components/SpeakerList.swift
+++ b/Sources/Conference/Components/SpeakerList.swift
@@ -28,9 +28,11 @@ struct SpeakerOverview: Component {
.class("h3")
H4(speaker.role)
.class("f-weight-300 mb-0")
- H4(speaker.company)
- .class("f-weight-300")
- .style("font-style: italic")
+ if let company = speaker.company {
+ H4(company)
+ .class("f-weight-300")
+ .style("font-style: italic")
+ }
}
.class("description p-2")
}
diff --git a/Sources/Conference/Components/Speakers.swift b/Sources/Conference/Components/Speakers.swift
index a3eb66f..888d34b 100644
--- a/Sources/Conference/Components/Speakers.swift
+++ b/Sources/Conference/Components/Speakers.swift
@@ -10,8 +10,9 @@ struct Speakers: Component {
.class("text-center")
H4("We host a diverse selection of inspiring speakers.")
.class("text-center mb-5")
- H4("Speakers will be announced soon").class("text-center mb-5")
-// SpeakerList(speakers: AllSpeakers.speakers)
+ SpeakerList(speakers: AllSpeakers.speakers)
+ H4("More speakers to be announced soon!")
+ .class("text-center mb-5")
}.class("container")
// Div {
// H1("Lightning Talk Speakers")
@@ -28,14 +29,14 @@ struct Speakers: Component {
Div {
H3("Call For Proposals")
.class("h3 text-center")
-// Paragraph("Our CFP is now closed - please check back next year!")
-// .class("text-center")
- Paragraph {
- Text("If you'd like to speak at this years ServerSide.swift, please apply via our CFP. We welcome and encourage talks from all abilities!")
- }.class("text-center")
- Div {
- Link("Apply To Speak", url: "https://www.papercall.io/server-side-swift-2024").linkTarget(.blank).class("btn btn-default btn-gradient")
- }.class("action-buttons pt-3 pb-3 text-center")
+ Paragraph("Our CFP is now closed - please check back next year!")
+ .class("text-center")
+ // Paragraph {
+ // Text("If you'd like to speak at this years ServerSide.swift, please apply via our CFP. We welcome and encourage talks from all abilities!")
+ // }.class("text-center")
+ // Div {
+ // Link("Apply To Speak", url: "https://www.papercall.io/server-side-swift-2024").linkTarget(.blank).class("btn btn-default btn-gradient")
+ // }.class("action-buttons pt-3 pb-3 text-center")
}.class("col")
}.class("container")
}.class("cfp page-block no-height bg-white")
diff --git a/Sources/Conference/Models/Speaker.swift b/Sources/Conference/Models/Speaker.swift
index 1da9bed..0dab194 100644
--- a/Sources/Conference/Models/Speaker.swift
+++ b/Sources/Conference/Models/Speaker.swift
@@ -3,20 +3,23 @@ import Plot
struct Speaker {
let name: String
let role: String
- let company: String
+ let company: String?
let url: String
let image: String
let twitter: String?
let github: String?
+ let mastodon: String?
let bio: Component
let talkIDs: [Int]
internal init(
name: String,
role: String,
- company: String,
+ company: String? = nil,
+ image: String? = nil,
twitter: String? = nil,
github: String? = nil,
+ mastodon: String? = nil,
bio: Component,
talkIDs: [Int]
) {
@@ -24,9 +27,14 @@ struct Speaker {
self.role = role
self.company = company
self.url = name.lowercased().replacingOccurrences(of: " ", with: "-")
- self.image = "/App/Images/speakers/\(name.lowercased().replacingOccurrences(of: " ", with: "-")).jpg"
+ if let image {
+ self.image = image
+ } else {
+ self.image = "/App/Images/speakers/\(name.lowercased().replacingOccurrences(of: " ", with: "-")).jpg"
+ }
self.twitter = twitter
self.github = github
+ self.mastodon = mastodon
self.bio = bio
self.talkIDs = talkIDs
}
@@ -34,21 +42,15 @@ struct Speaker {
internal init(
name: String,
role: String,
- company: String,
+ company: String? = nil,
+ image: String? = nil,
twitter: String? = nil,
github: String? = nil,
+ mastodon: String? = nil,
bio: String,
talkIDs: [Int]
) {
- self.name = name
- self.role = role
- self.company = company
- self.url = name.lowercased().replacingOccurrences(of: " ", with: "-")
- self.image = "/App/Images/speakers/\(name.lowercased().replacingOccurrences(of: " ", with: "-")).jpg"
- self.twitter = twitter
- self.github = github
- self.bio = Text(bio)
- self.talkIDs = talkIDs
+ self.init(name: name, role: role, company: company, image: image, twitter: twitter, github: github, mastodon: mastodon, bio: Text(bio), talkIDs: talkIDs)
}
var talks: [Talk] {
@@ -60,126 +62,122 @@ struct Speaker {
struct AllSpeakers {
static let speakers: [Speaker] = [
+ Speaker(
+ name: "Daniel Steinberg",
+ role: "Author, Speaker and Trainer",
+ company: "Dim Sum Thinking",
+ image: "/App/Images/speakers/daniel-steinberg.png",
+ mastodon: "https://mastodon.social/@dimsumthinking",
+ bio: ComponentGroup {
+ Paragraph {
+ Text("Daniel is the author of more than a dozen books including the best selling books ")
+ Link("The Curious Case of the Async Cafe", url: "https://editorscut.com/Books/Async/bookPage.html")
+ Text(", ")
+ Link("A SwiftUI Kickstart", url: "https://editorscut.com/Books/SwiftUIKickstart/bookPage.html")
+ Text(", ")
+ Link("A Swift Kickstart", url: "https://editorscut.com/Books/SwiftKickstart/bookPage.html")
+ Text(", ")
+ Link("A Bread Baking Kickstart", url: "https://editorscut.com/Books/Bread/bookPage.html")
+ Text(", and ")
+ Link("Dear Elena", url: "https://editorscut.com/Books/DearElena/bookPage.html")
+ Text(".")
+ }
+ Paragraph {
+ Text("Daniel presents iOS, SwiftUI, and Swift training and consults through his company ")
+ Link("Dim Sum Thinking", url: "https://dimsumthinking.com/")
+ Text(".")
+ }
+ Paragraph {
+ Text("He has written apps for the iPhone and the iPad since the SDKs first appeared and has written programs for the Mac all the way back to System 7. When he's not coding or talking about coding for the Mac, the iPhone, and the iPad he's probably cooking, baking bread, or hanging out with friends.")
+ }
+ Paragraph {
+ Text("Information on his ")
+ Link("books and videos", url: "https://editorscut.com/")
+ Text(" is available on the ")
+ Link("Editors Cut website", url: "https://editorscut.com/")
+ Text(". Details on his ")
+ Link("training", url: "https://dimsumthinking.com/Training/index.html")
+ Text(", and ")
+ Link("speaking", url: "https://dimsumthinking.com/Speaking/index.html")
+ Text(" is on the ")
+ Link("Dim Sum Thinking website", url: "https://dimsumthinking.com/")
+ Text(".")
+ }
+ },
+ talkIDs: [1]),
Speaker(
name: "Mikaela Caron",
- role: "iOS Engineer",
- company: "Lickability",
+ role: "Independent iOS Engineer",
twitter: "https://twitter.com/mikaela__caron",
github: "https://github.com/mikaelacaron",
- bio: "Mikaela Caron is an iOS Engineer at Lickability. She’s a self-taught developer, and transitioned into the tech industry from manufacturing. She creates content on YouTube, Instagram, and Twitter, sharing her knowledge about iOS development, daily life of a developer, and freelancing. She freelances part-time building iOS apps and her own indie apps. The first two apps she created were shared on her Instagram story, in her story highlights, showing how an app is built from sketch to published on the App Store. She is an organizer for iOSDevHappyHour and loves giving back to the community.",
- talkIDs: [12]),
- Speaker(
- name: "Matias Piipari",
- role: "Engineering Director",
- company: "Canonical",
- twitter: "https://twitter.com/mz2",
- github: "https://github.com/mz2",
- bio: "My name is Matias Piipari and I am an Engineering Director at Canonical, distributors of Ubuntu Linux. At Canonical I oversee distributed system testing of our Kubernetes and OpenStack based Cloud solutions and our varied hardware certification programs for devices ranging from data centre grade servers to tiny IoT devices. Before Canonical, I have over a decade of development experience on macOS and iOS as CTO of the Apple Design Award winning Papersapp.com, later as creator of the Mac based Manuscripts authoring tool acquired by Wiley & Sons, and most recently as Engineering Manager at the ADA winning Sketch. Even as my current role is Linux focused, I continue to build Mac and iOS based apps on my own time, and track the development of Swift as a language, and Swift based technologies.",
- talkIDs: [1]),
- Speaker(
- name: "Simon Pilkington",
- role: "Senior Software Engineer",
- company: "Prime Video",
- twitter: "https://twitter.com/tachyonics",
- github: "https://github.com/tachyonics",
- bio: "Senior Software Engineer at Prime Video and member of the SSWG",
- talkIDs: [2]),
- Speaker(
- name: "Ellen Shapiro",
- role: "Native Mobile Developer",
- company: "Gusto",
- twitter: "https://twitter.com/DesignatedNerd",
- github: "https://github.com/DesignatedNerd",
- bio: "Ellen Shapiro is a native mobile developer currently working at Gusto (the US payroll/HR one, not the UK food delivery one). She's built iOS and Android apps and SDKs for the last decade, including for SpotHero and Apollo GraphQL. She enjoys kayaking, music, laser woodworking, and complaining about the cold. She lives in Madison, Wisconsin with her wife and two cats.",
- talkIDs: [13]),
- Speaker(
- name: "Cory Benfield",
- role: "Senior Software Engineer",
- company: "Apple",
- twitter: "https://www.twitter.com/Lukasaoz",
- github: "https://www.github.com/Lukasa",
- bio: "Cory is a serial open source contributor and maintainer with almost a decade of experience building, maintaining, and innovating open source networking frameworks and protocol libraries. He's spent time as a core contributor or lead maintainer on a number of Python HTTP libraries and networking frameworks, including Requests, Hyper, and Twisted. Currently Cory is a Senior Software Engineer at Apple, putting his skills to use on high-performance networking frameworks such as SwiftNIO, Netty, and more.",
- talkIDs: [3]),
- Speaker(
- name: "Johannes Weiss",
- role: "Senior Software Engineer",
- company: "Apple",
- twitter: "https://www.twitter.com/johannesweiss",
- github: "https://www.github.com/weissi",
- bio: "Johannes likes low-level problems and high-level languages. He strives to reduce complexity and increase performance to enable beautiful, fast and correct programs.",
- talkIDs: [4]),
- Speaker(
- name: "Andrew Barba",
- role: "Founder",
- company: "Swift Cloud",
- bio: "Founder of Swift Cloud",
- talkIDs: [5])
-
+ mastodon: "https://swiftdevs.space/@mikaelacaron",
+ bio: "Mikaela Caron is an independent iOS Engineer who actively shares her expertise on social media, focusing on iOS development, building apps in public, and freelancing. She develops her own indie apps, works part-time as a freelancer, and is an organizer for iOSDevHappyHour. Mikaela loves giving back to the community.",
+ talkIDs: []),
]
static let lightningSpeakers: [Speaker] = [
- Speaker(
- name: "Dave Verwer",
- role: "Co-Founder",
- company: "Swift Package Index",
- twitter: "https://twitter.com/daveverwer",
- github: "https://github.com/daveverwer",
- bio: ComponentGroup {
- Text("Dave is a independent and freelance writer and iOS developer. He is the creator of ")
- Link("iOS Dev Weekly", url: "https://iosdevweekly.com")
- Text(" and co-founder of the ")
- Link("Swift Package Index", url: "https://swiftpackageindex.com")
- Text(". He has been developing for the Mac and iOS since 2006 and is secretly quite proud that his first professional gig had him using a (real) vt100 green screen terminal. He's glad he doesn't have to use that any more though! If you'd like to learn more about Dave, visit his ")
- Link("personal site", url: "https://daveverwer.com")
- Text(".")
- },
- talkIDs: [6]),
- Speaker(
- name: "Joannis Orlandos",
- role: "Founder",
- company: "Responsive Software",
- twitter: "https://twitter.com/joannisorlandos",
- github: "https://github.com/joannis",
- bio: "Previously Vapor core-team member, designer of Vapor 3 and still maintains over 20 Vapor related libraries. Joannis enjoys low-level software development, and is a strong advocate for reducing code complexity through well designed software.",
- talkIDs: [7]),
- Speaker(
- name: "Firas Safa",
- role: "iOS Engineer",
- company: "TrueLayer",
- github: "https://github.com/TheInkedEngineer",
- bio: "iOS Engineer, server-side-swift lover and design enthusiast | I love building things, writing articles, gaming and music | I go by `TheInkedEngineer`. | Based in Milan, originally from Lebanon.",
- talkIDs: [11]),
- Speaker(
- name: "Georg Tuparev",
- role: "Founder",
- company: "Tuparev Technologies",
- twitter: "https://twitter.com/tuparev",
- github: "https://github.com/tuparev",
- bio: "Since Georg bought his first NeXTstation in 1991 he got hooked on any NeXT and later - Apple, technology. Early adopter of the revolutionary for its time Enterprise Objects Framework (EOF) and later WebObjects, he is the principle developer of dozens of server-side applications for health care, finance, banking, large knowledge repositories, and science and laboratory systems. Currently his company (Tuparev Technologies) is involved in one of the largest financial and banking systems in The Netherlands and is working on an extremely complex system for detecting and monitoring space debris (space junk), and an early satellite collision warning system for ESA and other space agencies.",
- talkIDs: [8]),
- Speaker(
- name: "Andrea Scuderi",
- role: "Senior iOS Engineer",
- company: "JustEatTakeaway.com",
- twitter: "https://twitter.com/andreascuderi13",
- github: "https://github.com/swift-sprinter/aws-serverless-swift-api-template",
- bio: "Andrea is a Senior Engineer iOS @JustEat Takeaway with experience in the Marketplaces, Retail, Finance, Banking, Energy and Media industries. He is the creator of Swift-Sprinter an open-source library to work with Swift on AWS Lambda, ClippingCamera and Trackyzer an app for Cyclists.",
- talkIDs: [10]),
- Speaker(
- name: "Dorian Grolaux",
- role: "iOS Engineer",
- company: "data.ai",
- twitter: "https://twitter.com/MrSkwiggs",
- github: "https://github.com/MrSkwiggs",
- bio: ComponentGroup {
- Paragraph("I'm an iOS Engineer currently working at data.ai, have been in the field for the past 7 years and really, just love Swift!")
- Paragraph {
- Text("I've kept a close eye on Vapor for years now, because I'm really into server-side tech, but never really had any projects where I could explore it. Until iOS support was implemented, then I started working on a camera-streaming app which is currently in development but about to release soon (Testflight here, if you'd like to see for yourself: ")
- Link("https://testflight.apple.com/join/G2nWjlsH", url: "https://testflight.apple.com/join/G2nWjlsH")
- Text(")")
- }
- },
- talkIDs: [9])
+ // Speaker(
+ // name: "Dave Verwer",
+ // role: "Co-Founder",
+ // company: "Swift Package Index",
+ // twitter: "https://twitter.com/daveverwer",
+ // github: "https://github.com/daveverwer",
+ // bio: ComponentGroup {
+ // Text("Dave is a independent and freelance writer and iOS developer. He is the creator of ")
+ // Link("iOS Dev Weekly", url: "https://iosdevweekly.com")
+ // Text(" and co-founder of the ")
+ // Link("Swift Package Index", url: "https://swiftpackageindex.com")
+ // Text(". He has been developing for the Mac and iOS since 2006 and is secretly quite proud that his first professional gig had him using a (real) vt100 green screen terminal. He's glad he doesn't have to use that any more though! If you'd like to learn more about Dave, visit his ")
+ // Link("personal site", url: "https://daveverwer.com")
+ // Text(".")
+ // },
+ // talkIDs: [6]),
+ // Speaker(
+ // name: "Joannis Orlandos",
+ // role: "Founder",
+ // company: "Responsive Software",
+ // twitter: "https://twitter.com/joannisorlandos",
+ // github: "https://github.com/joannis",
+ // bio: "Previously Vapor core-team member, designer of Vapor 3 and still maintains over 20 Vapor related libraries. Joannis enjoys low-level software development, and is a strong advocate for reducing code complexity through well designed software.",
+ // talkIDs: [7]),
+ // Speaker(
+ // name: "Firas Safa",
+ // role: "iOS Engineer",
+ // company: "TrueLayer",
+ // github: "https://github.com/TheInkedEngineer",
+ // bio: "iOS Engineer, server-side-swift lover and design enthusiast | I love building things, writing articles, gaming and music | I go by `TheInkedEngineer`. | Based in Milan, originally from Lebanon.",
+ // talkIDs: [11]),
+ // Speaker(
+ // name: "Georg Tuparev",
+ // role: "Founder",
+ // company: "Tuparev Technologies",
+ // twitter: "https://twitter.com/tuparev",
+ // github: "https://github.com/tuparev",
+ // bio: "Since Georg bought his first NeXTstation in 1991 he got hooked on any NeXT and later - Apple, technology. Early adopter of the revolutionary for its time Enterprise Objects Framework (EOF) and later WebObjects, he is the principle developer of dozens of server-side applications for health care, finance, banking, large knowledge repositories, and science and laboratory systems. Currently his company (Tuparev Technologies) is involved in one of the largest financial and banking systems in The Netherlands and is working on an extremely complex system for detecting and monitoring space debris (space junk), and an early satellite collision warning system for ESA and other space agencies.",
+ // talkIDs: [8]),
+ // Speaker(
+ // name: "Andrea Scuderi",
+ // role: "Senior iOS Engineer",
+ // company: "JustEatTakeaway.com",
+ // twitter: "https://twitter.com/andreascuderi13",
+ // github: "https://github.com/swift-sprinter/aws-serverless-swift-api-template",
+ // bio: "Andrea is a Senior Engineer iOS @JustEat Takeaway with experience in the Marketplaces, Retail, Finance, Banking, Energy and Media industries. He is the creator of Swift-Sprinter an open-source library to work with Swift on AWS Lambda, ClippingCamera and Trackyzer an app for Cyclists.",
+ // talkIDs: [10]),
+ // Speaker(
+ // name: "Dorian Grolaux",
+ // role: "iOS Engineer",
+ // company: "data.ai",
+ // twitter: "https://twitter.com/MrSkwiggs",
+ // github: "https://github.com/MrSkwiggs",
+ // bio: ComponentGroup {
+ // Paragraph("I'm an iOS Engineer currently working at data.ai, have been in the field for the past 7 years and really, just love Swift!")
+ // Paragraph {
+ // Text("I've kept a close eye on Vapor for years now, because I'm really into server-side tech, but never really had any projects where I could explore it. Until iOS support was implemented, then I started working on a camera-streaming app which is currently in development but about to release soon (Testflight here, if you'd like to see for yourself: ")
+ // Link("https://testflight.apple.com/join/G2nWjlsH", url: "https://testflight.apple.com/join/G2nWjlsH")
+ // Text(")")
+ // }
+ // },
+ // talkIDs: [9])
]
}
diff --git a/Sources/Conference/Models/Talk.swift b/Sources/Conference/Models/Talk.swift
index 6628efa..e055e4a 100644
--- a/Sources/Conference/Models/Talk.swift
+++ b/Sources/Conference/Models/Talk.swift
@@ -47,91 +47,20 @@ struct AllTalks {
static let talks: [Talk] = [
Talk(
id: 1,
- title: "Canonical distributed Deb and Snap packaging of the Swift toolchain for Linux",
- description: "Swift is the language for modern, powerful apps on Apple’s platforms. However, the language feature set and CPU architecture support gives it enormous potential as an approachable, memory safe systems programming capable language for example to build server backends and programs in heterogeneous low memory footprint environments, for example in IoT devices. The multi-year work of the Swift Server Work Group, the recent addition of structured concurrency to the language, the associated effort towards Distributed Actors, and the already some years available dynamic callable support, are just some examples of the kind of powerful capabilities that have applications for Linux based programming for servers and IoT alike. The Linux packaging story of Swift has however remained partial and fragmented compared to other popular languages in the same category where packages are readily available, focusing in case of Linux more on deployment time considerations (Docker images) than development time needs. At Canonical, as the distributors of Ubuntu Linux and creators of the cross distribution Snap packaging format, we recognise the potential Swift has. In this talk I would like to announce availability of deb and Snap packaging of the Swift toolchain, and to demonstrate a Linux based development workflow, demonstrating several Linux based uses for the language, ranging from servers to IoT devices.",
- speakerNames: ["Matias Piipari"]
+ title: "When to Make a Macro",
+ description: "Over the years you have developed a collection of techniques for reducing repetitive and boilerplate code for server side Swift. If you are using Swift 5.9 or above you should consider adding Swift Macros to your tool belt. This fast moving session introduces you to freestanding and attached macros with some examples from each type that shows you when you should use them and how.",
+ speakerNames: ["Daniel Steinberg"]
),
- Talk(
- id: 2,
- title: "How Prime Video Learned to Stop Worrying and Ingest at Scale",
- description: "Over the past four years, we have built a new Video-On-Demand Content Ingestion Orchestration layer using Swift-based backend components and a variety of AWS tools and services such as Fargate and Lambda. This layer is now being used at scale to support the launch of titles across Prime Video including high profile titles such as Lord of the Rings: The Rings of Power. This talk will dive into what we built, its architecture, how we applied lessons we learnt from our previous architecture and what we learnt from building the new one.",
- speakerNames: ["Simon Pilkington"]
- ),
- Talk(
- id: 3,
- title: "Structured Concurrency for Server Developers",
- description: "Swift Concurrency revolutionized concurrent and parallel programming in Swift. Concurrency added a number of important features, such as actors and the async/await syntax, that make it easier than ever to write correct concurrent code in Swift. These features have been widely adopted in the server ecosystem, and they’re empowering server developers to write better services than ever before.\nAlongside these features, Swift Concurrency introduced the new programming style of structured concurrency. Adopting structured concurrency brings a wide range of benefits: it makes object lifetimes simpler, makes it easier to clean up, ensures errors aren’t lost, and makes it easier to reason about your concurrent code.\nIn this talk, we will introduce the concepts at the heart of structured concurrency and explains the value your services get from adopting it. We will then lay out a recommended structure for adopting structured concurrency on the server, including how to write NIO-based services with this new pattern.",
- speakerNames: ["Cory Benfield"]),
- Talk(
- id: 4,
- title: "Fearless Caching in the Cloud",
- description: ComponentGroup {
- Paragraph("Swift is used at Apple not just for developing applications and operating systems but also large-scale distributed systems. To succeed, Swift is designed to support single process architectures and scale up to distributed systems across many processes and machines.")
- Paragraph("One system that fits particularly well with Swift at scale is Content-Addressable Storage (CAS).")
- Paragraph("In this talk, we will be exploring what CAS is and how it can represent entire file hierarchies. We will describe how we can use server-side Swift to build a CAS that performs precision caching even at scale.")
- Paragraph("Throughout the talk we will touch on the similarities between Swift’s design and the requirements of a CAS system, like how value types and the Sendable protocol mirror immutability concepts in CAS, and how these similarities help developers write a correct and reliable system at any scale.")
- },
- speakerNames: ["Johannes Weiss"]),
- Talk(
- id: 5,
- title: "Globally Distributed Server Side Swift",
- description: "Learn how to deploy Swift applications to the edge, while only paying for what you use. ",
- speakerNames: ["Andrew Barba"]),
- Talk(
- id: 6,
- title: "How I accidentally ended up running the largest open-source Vapor site",
- description: "Tales from running the Swift Package Index",
- speakerNames: ["Dave Verwer"]),
- Talk(
- id: 7,
- title: "Why your libraries should use NIO Channels",
- description: "SwiftNIO enjoys a lot of powerful tools and features. ByteBuffers, EventLoops and EventLoopFuture are all well known in the ecosystem. But there’s an unsung hero among them that arguably is even more important. The Channel. This talk give you a rundown of what they are, why they matter, and how you can use them to build incredible systems with minimal complexity.",
- speakerNames: ["Joannis Orlandos"]),
- Talk(
- id: 8,
- title: "BrainObjects - new take on the 27 years old WebObjects/EOF framework",
- description: ComponentGroup {
- Paragraph("We will present ideas (and some initial architecture, design, and development) of a brand new open source Server-Side framework inspired by WebObjects/EOF, but written in Swift. EOF (Enterprise Object Framework) is data modelling and persistent layer that is a more powerful predecessor of CoreData.")
- Paragraph {
- Text("The BrainObjects project on GitHub: ")
- Link("https://github.com/BrainObjects", url: "https://github.com/BrainObjects")
- }
- },
- speakerNames: ["Georg Tuparev"]),
- Talk(
- id: 9,
- title: "Running Vapor on iOS",
- description: "See how to use Vapor as a web server in your applications",
- speakerNames: ["Dorian Grolaux"]),
- Talk(
- id: 10,
- title: "How to deploy a Swift Serverless API in AWS",
- description: "See how to deploy serverless Swift Applications on AWS",
- speakerNames: ["Andrea Scuderi"]),
- Talk(
- id: 11,
- title: "Building a mock server using Vapor",
- description: "See how to use Vapor to help mock APIs for testing",
- speakerNames: ["Firas Safa"]),
- Talk(
- id: 12,
- title: "How to Make Vapor Fly, Deploying Vapor on Fly.io",
- description: ComponentGroup {
- Paragraph {
- Link("Fly.io", url: "https://fly.io")
- Text(" is another platform to deploy your Vapor app, for free! In this talk, attendees will learn how to deploy their Vapor app to Fly using the Dockerfile. Having a familiarity with Docker and Linux will be helpful, but isn’t required.")
- }
- Paragraph {
- Text("After this talk, attendees will understand Fly as a platform, and can have their Vapor app deployed onto ")
- Link("Fly.io", url: "https://fly.io")
- Text(".")
- }
- },
- speakerNames: ["Mikaela Caron"]),
- Talk(
- id: 13,
- title: "Generating Code and Other Mischief with Swift Package Manager Plugins",
- description: "It’s the build tooling step everyone hates: “Now, add a new Run Script Build Phase.” The Swift and Xcode teams have worked to try to make things at least a little bit better for things which need to happen at build time by adding Build Tool Plugins and Command Plugins to Swift Package manager. In this talk, you’ll get a look at how to set these up to generate code and documentation, plus a look at some other silly things you can make it do.",
- speakerNames: ["Ellen Shapiro"])
+ // Talk(
+ // id: 4,
+ // title: "Fearless Caching in the Cloud",
+ // description: ComponentGroup {
+ // Paragraph("Swift is used at Apple not just for developing applications and operating systems but also large-scale distributed systems. To succeed, Swift is designed to support single process architectures and scale up to distributed systems across many processes and machines.")
+ // Paragraph("One system that fits particularly well with Swift at scale is Content-Addressable Storage (CAS).")
+ // Paragraph("In this talk, we will be exploring what CAS is and how it can represent entire file hierarchies. We will describe how we can use server-side Swift to build a CAS that performs precision caching even at scale.")
+ // Paragraph("Throughout the talk we will touch on the similarities between Swift’s design and the requirements of a CAS system, like how value types and the Sendable protocol mirror immutability concepts in CAS, and how these similarities help developers write a correct and reliable system at any scale.")
+ // },
+ // speakerNames: ["Johannes Weiss"]),
+
]
}