diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..a06105c
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,61 @@
+name: Deploy Jekyll site to GitHub Pages
+
+on:
+ push:
+ branches:
+ - master
+ - copilot/update-page-with-just-the-docs-template
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup Ruby
+ uses: ruby/setup-ruby@v1
+ with:
+ ruby-version: "3.2"
+ bundler-cache: true
+
+ - name: Generate build info
+ run: |
+ mkdir -p _data
+ SHORT_SHA="${GITHUB_SHA:0:7}"
+ echo "sha: \"$GITHUB_SHA\"" > _data/build_info.yml
+ echo "short_sha: \"$SHORT_SHA\"" >> _data/build_info.yml
+ echo "datetime: \"$(date -u '+%Y-%m-%d %H:%M:%S UTC')\"" >> _data/build_info.yml
+
+ - name: Setup Pages
+ id: pages
+ uses: actions/configure-pages@v5
+
+ - name: Build with Jekyll
+ run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}"
+ env:
+ JEKYLL_ENV: production
+
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ runs-on: ubuntu-latest
+ needs: build
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..b4eb84a
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source "https://rubygems.org"
+
+gem "just-the-docs", "0.12.0"
+gem "webrick", "~> 1.8"
diff --git a/_config.yml b/_config.yml
new file mode 100644
index 0000000..6194331
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1,34 @@
+title: Peter Kirschner
+description: >-
+ Conference talks and OSGi/Eclipse development resources by Peter Kirschner.
+baseurl: ""
+url: "https://peterkir.github.io"
+
+theme: just-the-docs
+
+color_scheme: light
+
+search_enabled: true
+search_tokenizer_separator: /[\s/]+/
+
+nav_sort: order
+
+back_to_top: true
+back_to_top_text: "Back to top"
+
+heading_anchors: true
+
+aux_links:
+ "GitHub":
+ - "https://github.com/peterkir"
+aux_links_new_tab: true
+
+footer_content: ""
+
+exclude:
+ - Gemfile.lock
+ - vendor/
+ - node_modules/
+ - "201410_EclipseCon_Europe/presentation/node_modules/"
+ - "201410_EclipseCon_Europe/presentation/test/"
+ - doc/
diff --git a/_data/build_info.yml b/_data/build_info.yml
new file mode 100644
index 0000000..18a5f56
--- /dev/null
+++ b/_data/build_info.yml
@@ -0,0 +1,3 @@
+sha: "local"
+short_sha: "local"
+datetime: "local build"
diff --git a/_includes/footer_custom.html b/_includes/footer_custom.html
new file mode 100644
index 0000000..3e5ec01
--- /dev/null
+++ b/_includes/footer_custom.html
@@ -0,0 +1,7 @@
+{% if site.data.build_info %}
+
+{% endif %}
diff --git a/_includes/head_custom.html b/_includes/head_custom.html
new file mode 100644
index 0000000..d7b2287
--- /dev/null
+++ b/_includes/head_custom.html
@@ -0,0 +1,9 @@
+
+
diff --git a/_includes/header_custom.html b/_includes/header_custom.html
new file mode 100644
index 0000000..cff7e35
--- /dev/null
+++ b/_includes/header_custom.html
@@ -0,0 +1,31 @@
+
+
+
diff --git a/assets/css/dark-mode.css b/assets/css/dark-mode.css
new file mode 100644
index 0000000..72613a8
--- /dev/null
+++ b/assets/css/dark-mode.css
@@ -0,0 +1,263 @@
+/*
+ * Dark mode support for just-the-docs v0.12
+ * Activates when data-theme="dark" on , or via system preference
+ * when data-theme is not explicitly set to "light".
+ */
+
+/* ─── Color variables ─────────────────────────────────────────────────── */
+
+:root {
+ --dk-page-bg: #ffffff;
+ --dk-sidebar-bg: #f5f6fa;
+ --dk-body-text: #27262b;
+ --dk-heading: #27262b;
+ --dk-link: #2869e6;
+ --dk-nav-link: #5c5962;
+ --dk-border: #eeebee;
+ --dk-code-bg: #f5f6fa;
+ --dk-code-text: #27262b;
+ --dk-table-head: #f5f6fa;
+ --dk-header-bg: rgba(255, 255, 255, 0.75);
+ --dk-toggle-border: #eeebee;
+ --dk-footer-bg: #f5f6fa;
+}
+
+html[data-theme="dark"] {
+ --dk-page-bg: #1b2024;
+ --dk-sidebar-bg: #22262a;
+ --dk-body-text: #d4d9e1;
+ --dk-heading: #f5f6fa;
+ --dk-link: #7253ed;
+ --dk-nav-link: #959396;
+ --dk-border: #44434d;
+ --dk-code-bg: #31333a;
+ --dk-code-text: #d4d9e1;
+ --dk-table-head: #2b2d35;
+ --dk-header-bg: rgba(27, 32, 36, 0.75);
+ --dk-toggle-border: #44434d;
+ --dk-footer-bg: #22262a;
+}
+
+@media (prefers-color-scheme: dark) {
+ html:not([data-theme="light"]) {
+ --dk-page-bg: #1b2024;
+ --dk-sidebar-bg: #22262a;
+ --dk-body-text: #d4d9e1;
+ --dk-heading: #f5f6fa;
+ --dk-link: #7253ed;
+ --dk-nav-link: #959396;
+ --dk-border: #44434d;
+ --dk-code-bg: #31333a;
+ --dk-code-text: #d4d9e1;
+ --dk-table-head: #2b2d35;
+ --dk-header-bg: rgba(27, 32, 36, 0.75);
+ --dk-toggle-border: #44434d;
+ --dk-footer-bg: #22262a;
+ }
+}
+
+/* ─── Override just-the-docs styles ──────────────────────────────────── */
+
+body,
+.main-content-wrap,
+.main-content {
+ background-color: var(--dk-page-bg) !important;
+ color: var(--dk-body-text);
+}
+
+.side-bar {
+ background-color: var(--dk-sidebar-bg) !important;
+ border-right: 1px solid var(--dk-border) !important;
+}
+
+.site-title,
+.site-title:hover,
+.site-title:visited {
+ color: var(--dk-heading) !important;
+}
+
+.main-header {
+ background-color: var(--dk-header-bg) !important;
+ border-bottom: 1px solid var(--dk-border) !important;
+}
+
+.site-footer {
+ background-color: var(--dk-footer-bg);
+ border-top: 1px solid var(--dk-border) !important;
+ color: var(--dk-body-text);
+}
+
+/* Headings */
+h1, h2, h3, h4, h5, h6 {
+ color: var(--dk-heading);
+}
+
+/* Links */
+a {
+ color: var(--dk-link);
+}
+
+a:visited {
+ color: var(--dk-link);
+}
+
+/* Navigation */
+.nav-list-link {
+ color: var(--dk-nav-link) !important;
+}
+
+.nav-list-link:hover,
+.nav-list-link.active {
+ color: var(--dk-heading) !important;
+ background-color: transparent;
+}
+
+.nav-list-item.active > .nav-list-link {
+ color: var(--dk-heading) !important;
+}
+
+.nav-list-expander svg {
+ fill: var(--dk-nav-link);
+}
+
+/* Code */
+code {
+ background-color: var(--dk-code-bg) !important;
+ color: var(--dk-code-text) !important;
+ border: 1px solid var(--dk-border);
+}
+
+pre,
+pre code,
+.highlight {
+ background-color: var(--dk-code-bg) !important;
+ color: var(--dk-code-text);
+ border-color: var(--dk-border);
+}
+
+pre code {
+ border: none;
+}
+
+/* Search */
+.search-input-wrap,
+.search-input-wrap .search-input {
+ background-color: var(--dk-sidebar-bg) !important;
+ color: var(--dk-body-text) !important;
+}
+
+.search-input-wrap .search-input::placeholder {
+ color: var(--dk-nav-link) !important;
+}
+
+.search-results-list-item {
+ background-color: var(--dk-sidebar-bg);
+ border-color: var(--dk-border);
+}
+
+.search-result {
+ border-bottom-color: var(--dk-border);
+ color: var(--dk-body-text);
+}
+
+.search-result-preview {
+ color: var(--dk-nav-link);
+}
+
+/* Tables */
+.main-content table {
+ background-color: var(--dk-page-bg);
+ color: var(--dk-body-text);
+}
+
+.main-content table th {
+ background-color: var(--dk-table-head) !important;
+ color: var(--dk-heading);
+ border-bottom-color: var(--dk-border);
+}
+
+.main-content table td {
+ border-top-color: var(--dk-border);
+}
+
+.main-content table tr:hover {
+ background-color: var(--dk-sidebar-bg);
+}
+
+/* Horizontal rules */
+hr {
+ border-color: var(--dk-border);
+}
+
+/* Blockquotes */
+blockquote {
+ color: var(--dk-nav-link);
+ border-left-color: var(--dk-border);
+}
+
+/* Buttons */
+.btn {
+ background-color: var(--dk-sidebar-bg);
+ color: var(--dk-body-text);
+ border-color: var(--dk-border);
+}
+
+.btn-primary {
+ background-color: var(--dk-link);
+ color: #ffffff;
+ border-color: var(--dk-link);
+}
+
+.btn:hover {
+ background-color: var(--dk-code-bg);
+}
+
+/* Labels */
+.label {
+ color: var(--dk-nav-link) !important;
+}
+
+/* ─── Build info footer ───────────────────────────────────────────────── */
+
+.build-info {
+ font-size: 0.7rem;
+ color: var(--dk-nav-link);
+ margin-top: 0.5rem;
+}
+
+.build-info a {
+ color: var(--dk-link);
+}
+
+/* ─── Theme toggle button ─────────────────────────────────────────────── */
+
+.theme-toggle {
+ background: none;
+ border: 1px solid var(--dk-toggle-border);
+ border-radius: 4px;
+ cursor: pointer;
+ padding: 4px 8px;
+ color: var(--dk-body-text);
+ display: inline-flex;
+ align-items: center;
+ font-size: 1rem;
+ line-height: 1;
+ vertical-align: middle;
+ margin-left: 0.5rem;
+}
+
+.theme-toggle:hover {
+ background-color: var(--dk-code-bg);
+}
+
+/* Show moon in light mode, sun in dark mode */
+.theme-toggle .sun-icon { display: none; }
+.theme-toggle .moon-icon { display: inline; }
+
+html[data-theme="dark"] .theme-toggle .sun-icon { display: inline; }
+html[data-theme="dark"] .theme-toggle .moon-icon { display: none; }
+
+@media (prefers-color-scheme: dark) {
+ html:not([data-theme="light"]) .theme-toggle .sun-icon { display: inline; }
+ html:not([data-theme="light"]) .theme-toggle .moon-icon { display: none; }
+}
diff --git a/assets/pdfs/Building_Nano_Services_with_OSGi_Declarative_Services_ECE2016.pdf b/assets/pdfs/Building_Nano_Services_with_OSGi_Declarative_Services_ECE2016.pdf
new file mode 100644
index 0000000..6837af2
Binary files /dev/null and b/assets/pdfs/Building_Nano_Services_with_OSGi_Declarative_Services_ECE2016.pdf differ
diff --git a/assets/pdfs/EpicSplit_EclipsePDE_Bndtools_ECE2014.pdf b/assets/pdfs/EpicSplit_EclipsePDE_Bndtools_ECE2014.pdf
new file mode 100644
index 0000000..359b9b4
Binary files /dev/null and b/assets/pdfs/EpicSplit_EclipsePDE_Bndtools_ECE2014.pdf differ
diff --git a/assets/pdfs/JumpstartIoTinJavaWithOSGienRoute_JFS2016.pdf b/assets/pdfs/JumpstartIoTinJavaWithOSGienRoute_JFS2016.pdf
new file mode 100644
index 0000000..9fb39d0
Binary files /dev/null and b/assets/pdfs/JumpstartIoTinJavaWithOSGienRoute_JFS2016.pdf differ
diff --git a/development.md b/development.md
new file mode 100644
index 0000000..22d53b2
--- /dev/null
+++ b/development.md
@@ -0,0 +1,46 @@
+---
+layout: default
+title: Development Resources
+nav_order: 3
+---
+
+# Development Resources
+
+---
+
+## OSGi Bundle Repositories (OBR)
+
+Pre-built OSGi Bundle Repository index files for Eclipse releases, suitable for use with BndTools and Eclipse IDE setups.
+
+[Browse OBR files]({{ '/static/obr/index.html' | relative_url }}){: .btn }
+
+Available index files for Eclipse versions: 3.6.2, 3.7.2, 3.8.2, 4.3.2, 4.4.0, 4.4.1, 4.6.0, 4.6.1 (Platform and Simultaneous releases).
+
+---
+
+## OSGi Runtime Debugging
+
+Tools and configuration for debugging OSGi runtimes using the Apache Felix Web Console and related plugins.
+
+[OSGi Debugging Setup]({{ '/static/osgi-debug/index.html' | relative_url }}){: .btn }
+
+Includes Apache Felix plugins:
+
+- Web Console
+- Declarative Services
+- Event Admin
+- Memory Usage
+- OBR Browser
+- Package Admin
+- Script Console
+- Subsystems
+
+---
+
+## Project Setups
+
+- [GitHub projects — OSGi and bnd/bndtools](https://peterkir.github.io/idefix/bootstrap/osgi/index.html){: target="_blank" }
+- [GitHub projects — peterkir](https://peterkir.github.io/idefix/bootstrap/peterkir/index.html){: target="_blank" }
+
+{: .note }
+The `idefix` project setup links above point to the [peterkir/idefix](https://github.com/peterkir/idefix){: target="_blank" } repository's GitHub Pages site.
diff --git a/index.html b/index.html
deleted file mode 100644
index bca5d8b..0000000
--- a/index.html
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/index.md b/index.md
new file mode 100644
index 0000000..b66784b
--- /dev/null
+++ b/index.md
@@ -0,0 +1,25 @@
+---
+layout: home
+title: Home
+nav_order: 1
+---
+
+# Peter Kirschner's GitHub Site
+
+OSGi & Eclipse enthusiast, Java developer, and conference speaker.
+
+---
+
+## Talks
+
+Conference presentations on OSGi, Eclipse RCP, bndtools, and IoT.
+
+[View all talks](talks){: .btn .btn-primary .mr-2 }
+
+---
+
+## Development Resources
+
+OSGi bundle repositories and debugging tools.
+
+[View development resources](development){: .btn }
diff --git a/talks.md b/talks.md
new file mode 100644
index 0000000..51c3a7e
--- /dev/null
+++ b/talks.md
@@ -0,0 +1,65 @@
+---
+layout: default
+title: Talks
+nav_order: 2
+---
+
+# Conference Talks
+
+---
+
+## EclipseCon Europe 2017 — Eclipse RCP with bndtools
+
+How to build Eclipse RCP applications using bndtools instead of Eclipse PDE.
+
+- [Source code on GitHub](https://github.com/peterkir/example.bnd.rcp){: target="_blank" }
+
+{: .note }
+The ECE2017 slides PDF was originally hosted on `eclipsecon.org/europe2017`, which is no longer accessible. The same slides were also used for the OSGi User Forum Germany 2017 workshop below.
+
+---
+
+## OSGi User Forum Germany Tooling Workshop 2017 — How to Build Eclipse Products from bndtools Bundles
+
+Hands-on workshop demonstrating the complete bndtools-based Eclipse RCP build workflow.
+
+- [Source code on GitHub](https://github.com/peterkir/example.bnd.rcp){: target="_blank" }
+
+---
+
+## EclipseCon Europe 2016 — Building Nano Services with OSGi Declarative Services
+
+Tutorial covering OSGi Declarative Services pattern for building modular, loosely-coupled Java applications.
+
+- [Slides (PDF)]({{ '/assets/pdfs/Building_Nano_Services_with_OSGi_Declarative_Services_ECE2016.pdf' | relative_url }}){: target="_blank" }
+- [Exercise slides presentation](https://peterkir.github.io/ece2016/slides/index.html){: target="_blank" }
+- [Exercise source code on GitHub](https://github.com/peterkir/ece2016){: target="_blank" }
+
+---
+
+## Java Forum Stuttgart 2016 — Jumpstart IoT in Java with OSGi enRoute
+
+Introduction to building IoT applications in Java using the OSGi enRoute framework.
+
+- [Interactive slides](https://peterkir.github.io/jfs2016/jfs2016-slides/){: target="_blank" }
+- [Slides (PDF)]({{ '/assets/pdfs/JumpstartIoTinJavaWithOSGienRoute_JFS2016.pdf' | relative_url }}){: target="_blank" }
+
+---
+
+## EclipseCon Europe 2014 — An Epic Split Between OSGi Tooling Eclipse PDE and BndTools
+
+Explores the differences between Eclipse PDE and BndTools for OSGi development, and how to use both in a mixed-mode setup.
+
+- [Interactive slides](https://peterkir.github.io/201410_EclipseCon_Europe/presentation/index.html){: target="_blank" }
+- [Slides (PDF)]({{ '/assets/pdfs/EpicSplit_EclipsePDE_Bndtools_ECE2014.pdf' | relative_url }}){: target="_blank" }
+- [Video on YouTube](https://www.youtube.com/watch?v=5CbPWafQvPg){: target="_blank" } 📹
+- [Source code on GitHub](https://github.com/peterkir/ece2014){: target="_blank" }
+
+---
+
+## EclipseCon Europe 2008 — Open System Engineering Environment: An Integrated Solution
+
+Early work on integrated tooling for embedded system engineering within Eclipse.
+
+{: .warning }
+The original slides link (`eclipsecon.org/summiteurope2008`) is no longer available — the Eclipse Summit Europe 2008 website has been taken down.