diff --git a/Website/trySwiftTokyo.xcworkspace/contents.xcworkspacedata b/Website/trySwiftTokyo.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..c683b56
--- /dev/null
+++ b/Website/trySwiftTokyo.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/Website/trySwiftTokyo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Website/trySwiftTokyo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/Website/trySwiftTokyo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/Website/trySwiftTokyo.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Website/trySwiftTokyo.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..a571e09
--- /dev/null
+++ b/Website/trySwiftTokyo.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,41 @@
+{
+ "pins" : [
+ {
+ "identity" : "ignite",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/twostraws/Ignite",
+ "state" : {
+ "branch" : "main",
+ "revision" : "5941faccd2e4d662b417c85097f27a7ae3cf93ba"
+ }
+ },
+ {
+ "identity" : "swift-argument-parser",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/apple/swift-argument-parser.git",
+ "state" : {
+ "revision" : "41982a3656a71c768319979febd796c6fd111d5c",
+ "version" : "1.5.0"
+ }
+ },
+ {
+ "identity" : "swift-cmark",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/swiftlang/swift-cmark.git",
+ "state" : {
+ "branch" : "gfm",
+ "revision" : "b022b08312decdc46585e0b3440d97f6f22ef703"
+ }
+ },
+ {
+ "identity" : "swift-markdown",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/swiftlang/swift-markdown.git",
+ "state" : {
+ "branch" : "main",
+ "revision" : "2c126ce9fa33fc8b48258ee27ab51b33989161a3"
+ }
+ }
+ ],
+ "version" : 2
+}
diff --git a/Website/trySwiftTokyo/Assets/images/riko_tokyo.svg b/Website/trySwiftTokyo/Assets/images/riko_tokyo.svg
new file mode 100644
index 0000000..e6f313b
--- /dev/null
+++ b/Website/trySwiftTokyo/Assets/images/riko_tokyo.svg
@@ -0,0 +1,117 @@
+
+
\ No newline at end of file
diff --git a/Website/trySwiftTokyo/Package.swift b/Website/trySwiftTokyo/Package.swift
new file mode 100644
index 0000000..84a0e25
--- /dev/null
+++ b/Website/trySwiftTokyo/Package.swift
@@ -0,0 +1,18 @@
+// swift-tools-version: 5.9
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+ name: "trySwiftTokyo",
+ platforms: [.macOS(.v13)],
+ dependencies: [
+ .package(url: "https://github.com/twostraws/Ignite", branch: "main")
+ ],
+ targets: [
+ .executableTarget(
+ name: "trySwiftTokyo",
+ dependencies: ["Ignite"]
+ ),
+ ]
+)
diff --git a/Website/trySwiftTokyo/Sources/Component/MainFooter.swift b/Website/trySwiftTokyo/Sources/Component/MainFooter.swift
new file mode 100644
index 0000000..e125a69
--- /dev/null
+++ b/Website/trySwiftTokyo/Sources/Component/MainFooter.swift
@@ -0,0 +1,22 @@
+import Foundation
+import Ignite
+
+struct MainFooter: Component {
+ func body(context: PublishingContext) -> [any PageElement] {
+ Column {
+ Text {
+ Link("行動規範", target: URL("https://tryswift.jp/code-of-conduct"))
+ .margin(.trailing, .small)
+ Link("プライバシーポリシー", target: URL("https://tryswift.jp/privacy-policy"))
+ }
+ .font(.body)
+ .fontWeight(.semibold)
+ .horizontalAlignment(.center)
+
+ Text("© 2016 try! Swift Tokyo")
+ .font(.body)
+ .fontWeight(.light)
+ .horizontalAlignment(.center)
+ }
+ }
+}
diff --git a/Website/trySwiftTokyo/Sources/ConferenceWebsite.swift b/Website/trySwiftTokyo/Sources/ConferenceWebsite.swift
new file mode 100644
index 0000000..a9541d6
--- /dev/null
+++ b/Website/trySwiftTokyo/Sources/ConferenceWebsite.swift
@@ -0,0 +1,23 @@
+import Foundation
+import Ignite
+
+@main
+struct ConferenceWebsite {
+ static func main() async {
+ let site = ConferenceSite2025()
+
+ do {
+ try await site.publish()
+ } catch {
+ print(error.localizedDescription)
+ }
+ }
+}
+
+struct ConferenceSite2025: Site {
+ var name = "try! Swift Tokyo"
+ var url = URL("https://tryswift.jp")
+
+ var homePage = Home()
+ var theme = MainTheme()
+}
diff --git a/Website/trySwiftTokyo/Sources/Pages/Home.swift b/Website/trySwiftTokyo/Sources/Pages/Home.swift
new file mode 100644
index 0000000..b2e6879
--- /dev/null
+++ b/Website/trySwiftTokyo/Sources/Pages/Home.swift
@@ -0,0 +1,20 @@
+import Foundation
+import Ignite
+
+struct Home: StaticPage {
+ var title = "try! Swift Tokyo 2025"
+
+ func body(context: PublishingContext) -> [BlockElement] {
+ Text(title)
+ .font(.title1)
+
+ Section {
+ Image("/images/riko_tokyo.svg", description: "Riko at Tokyo")
+ .resizable()
+ .frame(maxWidth: 250)
+ .padding()
+ }
+ .horizontalAlignment(.center)
+ .margin(.bottom, .extraLarge)
+ }
+}
diff --git a/Website/trySwiftTokyo/Sources/Themes/MainTheme.swift b/Website/trySwiftTokyo/Sources/Themes/MainTheme.swift
new file mode 100644
index 0000000..830e5b3
--- /dev/null
+++ b/Website/trySwiftTokyo/Sources/Themes/MainTheme.swift
@@ -0,0 +1,16 @@
+import Foundation
+import Ignite
+
+struct MainTheme: Theme {
+ func render(page: Page, context: PublishingContext) -> HTML {
+ HTML {
+ Head(for: page, in: context)
+
+ Body {
+ page.body
+
+ MainFooter()
+ }
+ }
+ }
+}