diff --git a/.geminiignore b/.geminiignore deleted file mode 100644 index 9b76e35c..00000000 --- a/.geminiignore +++ /dev/null @@ -1,2 +0,0 @@ -.next/ -node_modules/ \ No newline at end of file diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml new file mode 100644 index 00000000..1fe9eb9e --- /dev/null +++ b/.gitea/workflows/main.yaml @@ -0,0 +1,62 @@ +name: Next.js App CI + +on: + push: + branches: [ "main" ] + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Login to Gitea Package Registry + uses: docker/login-action@v3 + with: + registry: ${{vars.LOCAL_REGISTRY}} + username: ${{ VARS.USER }} + password: ${{ secrets.TOKEN }} + + # --- ADDED: Step to generate image assets before the build --- + - name: Generate Static Image Assets + run: | + # Install dependencies required by the scripts + sudo apt-get update && sudo apt-get install -y imagemagick webp + + # Make scripts executable + chmod +x ./scripts/*.sh + + # Run the scripts to generate PNGs from PDFs and create WebP images + echo "Generating PNGs from PDFs..." + bash ./scripts/first_page_image.sh + echo "Generating WebP images..." + bash ./scripts/generate_webp.sh + + # --- REPLACED: The following steps are changed from Ruby/Jekyll to Node.js/Next.js --- + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20.x' # Use a current LTS version of Node.js + cache: 'npm' + + - name: Install Node.js Dependencies + run: npm ci # 'npm ci' is recommended for CI for faster, reliable installs + + - name: Build Next.js App + run: npm run build + # --- END OF REPLACED STEPS --- + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # --- UNCHANGED: This step remains the same as requested --- + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64 + push: true + tags: | + ${{ vars.LOCAL_REGISTRY }}/${{ gitea.repository_owner }}/website:latest + ${{ vars.LOCAL_REGISTRY }}/${{ gitea.repository_owner }}/website:${{ gitea.sha }} \ No newline at end of file diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml deleted file mode 100644 index adb015a1..00000000 --- a/.gitea/workflows/main.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Jekyll site CI - -on: - push: - branches: [ "main" ] - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Login to Gitea Package Registry - # (Test credentials early, befor failing late in the process.) - uses: docker/login-action@v3 - with: - registry: ${{vars.LOCAL_REGISTRY}} - username: ${{ VARS.USER }} - password: ${{ secrets.TOKEN }} - - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.3' - - - name: Install GEM bundle - run: bundle install - - - name: Build Website using Jekyll - run: JEKYLL_ENV=production bundle exec jekyll build --trace --future - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - platforms: linux/amd64 # ,linux/arm64 - push: true - tags: | - ${{ vars.LOCAL_REGISTRY }}/${{ gitea.repository_owner }}/website:latest - ${{ vars.LOCAL_REGISTRY }}/${{ gitea.repository_owner }}/website:${{ gitea.sha }} \ No newline at end of file diff --git a/_bibliography.bib b/_bibliography.bib deleted file mode 100644 index ec6290c2..00000000 --- a/_bibliography.bib +++ /dev/null @@ -1,239 +0,0 @@ ---- ---- -References -========== -@inproceedings {koelle23primate, -title = {Improving Primate Sounds Classification using Binary Presorting for Deep Learning}, -author = {Kölle, Michael and Illium, Steffen and Zorn, Maximilian and Nü{\ss}lein, Jonas and Suchostawski, Patrick and Linnhoff-Popien, Claudia}, -year = {2023}, -organization = {Int. Conference on Deep Learning Theory and Application - DeLTA 2023}, -publisher = {Springer CCIS Series}, -} - -@inproceedings{zorn23surprise, -author = {Zorn, Maximilian and Illium, Steffen and Phan, Thomy and Kaiser, Tanja Katharina and Linnhoff-Popien, Claudia and Gabor, Thomas}, -title = {Social Neural Network Soups with Surprise Minimization}, -year = {2023}, -publisher = {MIT Press Direct}, -organization={Conference on Artificial Life - Alife 2023}, -} - -@inproceedings{feld2018trajectory, - title={Trajectory annotation using sequences of spatial perception}, - author={Feld, Sebastian and Illium, Steffen and Sedlmeier, Andreas and Belzner, Lenz}, - booktitle={Proceedings of the 26th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems}, - pages={329--338}, - year={2018} -} - -@article{gabor2022self, - title={Self-replication in neural networks}, - author={Gabor, Thomas and Illium, Steffen and Zorn, Maximilian and Lenta, Cristian and Mattausch, Andy and Belzner, Lenz and Linnhoff-Popien, Claudia}, - journal={Artificial Life}, - volume={28}, - number={2}, - pages={205--223}, - year={2022}, - publisher={MIT Press One Broadway, 12th Floor, Cambridge, Massachusetts 02142, USA~…} -} - -@proceedings{gabor2019self, - author = {Gabor, Thomas and Illium, Steffen and Mattausch, Andy and Belzner, Lenz and Linnhoff-Popien, Claudia}, - title = "{Self-Replication in Neural Networks}", - volume = {ALIFE 2019: The 2019 Conference on Artificial Life}, - series = {Artificial Life Conference Proceedings}, - pages = {424-431}, - year = {2019}, - month = {07}, - doi = {10.1162/isal_a_00197}, - url = {https://doi.org/10.1162/isal\_a\_00197}, - eprint = {https://direct.mit.edu/isal/proceedings-pdf/isal2019/31/424/1903421/isal\_a\_00197.pdf}, -} - - -@article{elsner2019deep, - title={Deep neural baselines for computational paralinguistics}, - author={Elsner, Daniel and Langer, Stefan and Ritz, Fabian and Mueller, Robert and Illium, Steffen}, - journal={arXiv preprint arXiv:1907.02864}, - year={2019} -} - -@inproceedings{muller2020soccer, - title={Soccer Team Vectors}, - author={Müller, Robert and Langer, Stefan and Ritz, Fabian and Roch, Christoph and Illium, Steffen and Linnhoff-Popien, Claudia}, - booktitle={Machine Learning and Knowledge Discovery in Databases: International Workshops of ECML PKDD 2019, Würzburg, Germany, September 16--20, 2019, Proceedings, Part II}, - pages={247--257}, - year={2020}, - organization={Springer International Publishing} -} - -@inproceedings{friedrich2020hybrid, - title={A Hybrid Approach for Segmenting and Fitting Solid Primitives to 3D Point Clouds}, - author={Friedrich, Markus and Illium, Steffen and Fayolle, Pierre-Alain and Linnhoff-Popien, Claudia}, - booktitle={15th International Joint Conference on Computer Graphics Theory and Applications}, - year={2020} -} - -@inproceedings{sedlmeier2020policy, - title={Policy entropy for out-of-distribution classification}, - author={Sedlmeier, Andreas and Müller, Robert and Illium, Steffen and Linnhoff-Popien, Claudia}, - booktitle={Artificial Neural Networks and Machine Learning--ICANN 2020: 29th International Conference on Artificial Neural Networks, Bratislava, Slovakia, September 15--18, 2020, Proceedings, Part II 29}, - pages={420--431}, - year={2020}, - organization={Springer International Publishing} -} - -@article{muller2020acoustic, - title={Acoustic anomaly detection for machine sounds based on image transfer learning}, - author={Müller, Robert and Ritz, Fabian and Illium, Steffen and Linnhoff-Popien, Claudia}, - journal={arXiv preprint arXiv:2006.03429}, - year={2020} -} - -@article{illium2020meantime, - title={What to do in the meantime: A service coverage analysis for parked autonomous vehicles}, - author={Illium, Steffen and Friese, Philipp Andreas and Müller, Robert and Feld, Sebastian}, - journal={AGILE: GIScience Series}, - volume={1}, - pages={7}, - year={2020}, - publisher={Copernicus Publications Göttingen, Germany} -} - -@inproceedings{illium2020surgical, - title={Surgical Mask Detection with Convolutional Neural Networks and Data Augmentations on Spectrograms}, - author={Illium, Steffen and M{\"u}ller, Robert and Sedlmeier, Andreas and Linnhoff-Popien, Claudia}, - booktitle={Proc. Interspeech 2020}, - pages={2052--2056}, - year={2020} -} - -@article{muller2020analysis, - title={Analysis of feature representations for anomalous sound detection}, - author={Müller, Robert and Illium, Steffen and Ritz, Fabian and Schmid, Kyrill}, - journal={arXiv preprint arXiv:2012.06282}, - year={2020} -} - -@article{muller2021acoustic, - title={Acoustic leak detection in water networks}, - author={Müller, Robert and Illium, Steffen and Ritz, Fabian and Schröder, Tobias and Platschek, Christian and Ochs, Jörg and Linnhoff-Popien, Claudia}, - journal={arXiv preprint arXiv:2012.06280}, - year={2020} -} - -@inproceedings{gabor2021goals, - title={Goals for self-replicating neural networks}, - author={Gabor, Thomas and Illium, Steffen and Zorn, Maximilian and Linnhoff-Popien, Claudia}, - booktitle={Artificial Life Conference Proceedings 33}, - volume={2021}, - number={1}, - pages={101}, - year={2021}, - organization={MIT Press One Rogers Street, Cambridge, MA 02142-1209, USA journals-info~…} -} - -@article{illium2021visual, - title={Visual Transformers for Primates Classification and Covid Detection}, - author={Illium, Steffen and Müller, Robert and Sedlmeier, Andreas and Popien, Claudia-Linnhoff}, - journal={Proc. Interspeech 2021}, - pages={451--455}, - year={2021} -} - -@article{muller2021deep, - title={A Deep and Recurrent Architecture for Primate Vocalization Classification}, - author={Müller, Robert and Illium, Steffen and Linnhoff-Popien, Claudia}, - journal={Proc. Interspeech 2021}, - pages={461--465}, - year={2021} -} - -@inproceedings{muller2021deep, - title={Deep recurrent interpolation networks for anomalous sound detection}, - author={Müller, Robert and Illium, Steffen and Linnhoff-Popien, Claudia}, - booktitle={2021 International Joint Conference on Neural Networks (IJCNN)}, - pages={1--7}, - year={2021}, - organization={IEEE} -} - -@inproceedings{friedrich2022csg, - title={CSG Tree Extraction from 3D Point Clouds and Meshes Using a Hybrid Approach}, - author={Friedrich, Markus and Illium, Steffen and Fayolle, Pierre-Alain and Linnhoff-Popien, Claudia}, - booktitle={Computer Vision, Imaging and Computer Graphics Theory and Applications: 15th International Joint Conference, VISIGRAPP 2020 Valletta, Malta, February 27--29, 2020, Revised Selected Papers}, - pages={53--79}, - year={2022}, - organization={Springer International Publishing Cham} -} - -@inproceedings{illium2022empirical, - title={Empirical Analysis of Limits for Memory Distance in Recurrent Neural Networks}, - author={Illium, Steffen and Schillman, Thore and Müller, Robert and Gabor, Thomas and Linnhoff-Popien, Claudia}, - booktitle={14th International Conference on Agents and Artificial Intelligence: ICAART}, - volume={3}, - number={Proceedings}, - pages={308--315}, - year={2022} -} - -@inproceedings{muller2022towards, - title={Towards Anomaly Detection in Reinforcement Learning}, - author={Müller, Robert and Illium, Steffen and Phan, Thomy and Haider, Tom and Linnhoff-Popien, Claudia}, - booktitle={Proceedings of the 21st International Conference on Autonomous Agents and Multiagent Systems}, - pages={1799--1803}, - year={2022} -} - -@inproceedings{nusslein2022case, - title={Case-Based Inverse Reinforcement Learning Using Temporal Coherence}, - author={Nüßlein, Jonas and Illium, Steffen and Müller, Robert and Gabor, Thomas and Linnhoff-Popien, Claudia}, - booktitle={Case-Based Reasoning Research and Development: 30th International Conference, ICCBR 2022, Nancy, France, September 12--15, 2022, Proceedings}, - pages={304--317}, - year={2022}, - organization={Springer International Publishing Cham} -} - -@inproceedings{illium2022constructing, - title={Constructing organism networks from collaborative self-replicators}, - author={Illium, Steffen and Zorn, Maximilian and Lenta, Cristian and K{\"o}lle, Michael and Linnhoff-Popien, Claudia and Gabor, Thomas}, - booktitle={2022 IEEE Symposium Series on Computational Intelligence (SSCI)}, - pages={1268--1275}, - year={2022}, - organization={IEEE} -} - -@inproceedings{illium2023voronoipatches, - title={VoronoiPatches: Evaluating a New Data Augmentation Method}, - author={Illium, Steffen and Griffin, Gretchen and K{\"o}lle, Michael and Zorn, Maximilian and N{\"u}sslein, Jonas and Linnhoff-Popien, Claudia}, - booktitle={International Conference on Agents and Artificial Intelligence}, - volume={15}, - number={Volume 3}, - pages={350--357}, - year={2023} -} - -@article{kolle2023compression, - title={Compression of GPS Trajectories using Autoencoders}, - author={Kölle, Michael and Illium, Steffen and Hahn, Carsten and Schauer, Lorenz and Hutter, Johannes and Linnhoff-Popien, Claudia}, - journal={arXiv preprint arXiv:2301.07420}, - year={2023} - -} - -@inproceedings{altmann2024emergence, - title={Emergence in Multi-agent Systems: A Safety Perspective}, - author={Altmann, Philipp and Schönberger, Julian and Illium, Steffen and Zorn, Maximilian and Ritz, Fabian and Haider, Tom and Burton, Simon and Gabor, Thomas}, - booktitle={International Symposium on Leveraging Applications of Formal Methods}, - pages={104--120}, - year={2024}, - organization={Springer Nature Switzerland Cham} -} - -@article{kolle2024aquarium, - title={Aquarium: A Comprehensive Framework for Exploring Predator-Prey Dynamics through Multi-Agent Reinforcement Learning Algorithms}, - author={Kölle, Michael and Erpelding, Yannick and Ritz, Fabian and Phan, Thomy and Illium, Steffen and Linnhoff-Popien, Claudia}, - journal={arXiv preprint arXiv:2401.07056}, - year={2024} - -} \ No newline at end of file diff --git a/src/app/blog/[slug]/page.tsx b/app/blog/[slug]/page.tsx similarity index 81% rename from src/app/blog/[slug]/page.tsx rename to app/blog/[slug]/page.tsx index babb431b..7d278272 100644 --- a/src/app/blog/[slug]/page.tsx +++ b/app/blog/[slug]/page.tsx @@ -1,11 +1,11 @@ import { getPostBySlug, getPostSlugs } from '@/lib/mdx'; -import { CitationProvider } from '@/context/citation-context'; -import { ReferencesContainer } from '@/components/references-container'; +import { CitationProvider } from '@/components/context-citation'; +import { ReferencesContainer } from '@/components/container-references'; import { notFound } from 'next/navigation'; import Image from 'next/image'; -import { DATA } from '@/data/resume'; +import { DATA } from '@/app/resume'; import { getPublicationsData } from '@/lib/publications'; -import { CustomMDX } from '@/components/custom-mdx'; +import { CustomMDX } from '@/components/mdx-custom'; import Link from 'next/link'; export async function generateStaticParams() { @@ -13,8 +13,8 @@ export async function generateStaticParams() { return slugs.map((slug) => ({ slug })); } -export async function generateMetadata({ params }: { params: { slug: string } }) { - const post = await getPostBySlug('blog', params.slug); +export async function generateMetadata({ params: { slug } }: { params: { slug: string } }) { + const post = await getPostBySlug('blog', slug); if (!post) { return {}; } @@ -24,8 +24,8 @@ export async function generateMetadata({ params }: { params: { slug: string } }) }; } -export default async function BlogPage({ params }: { params: { slug: string } }) { - const post = await getPostBySlug('blog', params.slug); +export default async function BlogPage({ params: { slug } }: { params: { slug: string } }) { + const post = await getPostBySlug('blog', slug); const publications = getPublicationsData(); if (!post) { diff --git a/src/app/blog/page.tsx b/app/blog/page.tsx similarity index 96% rename from src/app/blog/page.tsx rename to app/blog/page.tsx index e68d634a..86f2da22 100644 --- a/src/app/blog/page.tsx +++ b/app/blog/page.tsx @@ -1,6 +1,6 @@ import { getSortedPostsData } from "@/lib/posts"; import { ProjectCard } from "@/components/project-card"; -import BlurFade from "@/components/magicui/blur-fade"; +import { BlurFade } from "@/components/magicui/blur-fade"; const BLUR_FADE_DELAY = 0.04; diff --git a/src/app/connect/page.tsx b/app/connect/page.tsx similarity index 82% rename from src/app/connect/page.tsx rename to app/connect/page.tsx index a95579ea..89ba453c 100644 --- a/src/app/connect/page.tsx +++ b/app/connect/page.tsx @@ -1,9 +1,11 @@ -import { DATA } from "@/data/resume"; +import { DATA } from "@/app/resume"; import Image from "next/image"; import Link from "next/link"; -import BlurFade from "@/components/magicui/blur-fade"; + import { Button } from "@/components/ui/button"; import { CenteredImage } from "@/components/centered-image"; +import { BlurFade } from "@/components/magicui/blur-fade"; +import { TrackedLink } from "@/components/util-tracked-link"; const BLUR_FADE_DELAY = 0.05; @@ -37,20 +39,22 @@ export default function ConnectPage() {
{socialLinks.map(([name, social]) => ( - + - + ))}
- -
-
+
+ +
+
+
diff --git a/app/experience/[slug]/page.tsx b/app/experience/[slug]/page.tsx new file mode 100644 index 00000000..164cf5eb --- /dev/null +++ b/app/experience/[slug]/page.tsx @@ -0,0 +1,48 @@ +import { getPostBySlug, getPostSlugs } from '@/lib/mdx'; +import { notFound } from 'next/navigation'; +import { DATA } from '@/app/resume'; +import { getPublicationsData } from '@/lib/publications'; +import { Article } from '@/components/page-article'; + +export async function generateStaticParams() { + const slugs = getPostSlugs('experience'); + return slugs.map((slug) => ({ slug })); +} + +export async function generateMetadata({ params }: { params: { slug: string } }) { + // FIX: Await params to get slug for Next.js 15 + const { slug } = await params; + + const post = await getPostBySlug('experience', slug); + if (!post) { return {}; } + return { + title: post.frontmatter.title, + description: post.frontmatter.teaser || DATA.description, + }; +} + +export default async function ExperiencePage({ params }: { params: { slug: string } }) { + // FIX: Await params to get slug for Next.js 15 + const { slug } = await params; + + const post = await getPostBySlug('experience', slug); + const publications = getPublicationsData(); + + if (!post) { + notFound(); + } + + // --- Navigation Logic --- + const allSlugs = getPostSlugs('experience'); + const currentIndex = allSlugs.findIndex((s) => s === slug); + const prevSlug = currentIndex > 0 ? allSlugs[currentIndex - 1] : null; + const nextSlug = currentIndex < allSlugs.length - 1 ? allSlugs[currentIndex + 1] : null; + const prevPost = prevSlug ? await getPostBySlug('experience', prevSlug) : null; + const nextPost = nextSlug ? await getPostBySlug('experience', nextSlug) : null; + const navigation = { + prev: prevPost ? { slug: prevSlug, title: prevPost.frontmatter.title } : null, + next: nextPost ? { slug: nextSlug, title: nextPost.frontmatter.title } : null, + }; + + return
; +} \ No newline at end of file diff --git a/src/app/teaching/page.tsx b/app/experience/page.tsx similarity index 51% rename from src/app/teaching/page.tsx rename to app/experience/page.tsx index bb64aa7b..2232b6f5 100644 --- a/src/app/teaching/page.tsx +++ b/app/experience/page.tsx @@ -1,18 +1,18 @@ -// src/pages/teaching.tsx (or wherever your teaching page is) +// src/pages/experience.tsx import { getSortedPostsData } from "@/lib/posts"; import { ProjectCard } from "@/components/project-card"; -import { ProjectListItem } from "@/components/project-list-item"; // Import the new component -import BlurFade from "@/components/magicui/blur-fade"; +import { ExperienceCard } from "@/components/list-item"; // Import the new component +import { BlurFade } from "@/components/magicui/blur-fade"; const BLUR_FADE_DELAY = 0.04; -export default function TeachingPage() { - const posts = getSortedPostsData("teaching"); +export default function ExperiencePage() { + const posts = getSortedPostsData("experience"); // Filter out posts that might not be suitable for a list item if needed, // or ensure your getSortedPostsData provides necessary fields for both. - const teachingProjects = posts.filter((post) => post.title); + const experiencePosts = posts.filter((post) => post.title); return (
@@ -20,22 +20,20 @@ export default function TeachingPage() {

- Teaching + Experience

- At LMU Munich, I mentored undergraduate and graduate students, contributed to large-scale lectures, and led practical seminars and courses. The following sections detail my teaching experience.
-
- For a detailed list please visit my
LMU profile page. + My professional experience encompasses both hands-on systems engineering and academic instruction. I've worked at the intersection of machine learning and complex systems, with projects ranging from exploring emergent behavior in AI to managing cluster infrastructure. In my role at LMU Munich, I further developed this experience by mentoring students, contributing to lectures, and leading practical seminars.


-
{/* Use flex-col for list items */} - {teachingProjects.map((post, id) => ( +
+ {experiencePosts.map((post, id) => ( - - - -
- {children} - - - + +
+ {children} +