{
  "APP": {
    "TITLE": "Playground",
    "COPYRIGHT": "Images and code protected by copyright, no use without permission!"
  },
  "TOPBAR": {
    "ABOUT": "About me",
    "IMPRINT": "Impressum",
    "PROJECTS": "Projects",
    "ALGORITHMS": "Algorithms",
    "SETTINGS": "Settings",
    "LANGUAGE": "Language",
    "APPEARANCE": "Appearance"
  },
  "THEME": { "LIGHT": "Light", "DARK": "Dark" },
  "LANG": { "LABEL": "Language", "EN": "English", "DE": "Deutsch" },
  "ABOUT": {
    "ALT": { "PROFILE": "Profile photo of Andreas Dahm" },
    "HELLO": "Hello, I’m Andreas.",
    "LEAD": "I first discovered my interest in software development during my training as an application developer. After completing my degree in Applied Computer Science at FH Bingen, I have been working continuously as a software developer since 2010. During this time, I have gained experience in various areas, including 3D simulation and modern web applications. I also enjoy working on personal software projects, particularly in game development and algorithmic topics. Thank you for stopping by!",
    "ROLE": "Senior Software Developer / Full-Stack Developer / Software Architect",
    "LOCATION": "Munich · Remote",
    "DOWNLOAD_CV": "Download CV",
    "VIEW_PROJECTS": "View projects",
    "CONTACT_ME": "Contact me",
    "SECTION": {
      "SKILLS": "Skills & Stack",
      "BACKEND_ARCH": "Backend & Architecture",
      "INFRA_CLOUD": "Infrastructure & Cloud",
      "SIM_ALGO": "Simulation & Algorithms",
      "EXPERIENCE": "Experience",
      "PROJECTS": "Projects",
      "EDUCATION": "Education"
    },
    "SKILLS": {
      "JAVA": "Java 8/21+",
      "SPRING": "Spring Boot 2/3",
      "ANGULAR": "Angular 19+",
      "DOCKER": "Docker",
      "UNITY": "Unity",
      "PYTHON": "Python",
      "CSHARP": "C#",
      "TYPESCRIPT": "TypeScript",
      "ARCH_MICROSERVICES": "Microservices",
      "ARCH_CLOUD": "Cloud Architecture",
      "ENG_ALGO": "Algorithm Design",
      "ENG_SIM": "3D Simulation",
      "ENG_GPU": "WebGPU / OpenGL / GLSL",
      "ENG_PERF": "Performance Optimization",
      "ENG_3D": "3D-Scanner Tech"
    },
    "TOOLS": {
      "GIT": "Git",
      "GITHUB": "Github",
      "GITLAB": "Gitlab",
      "JENKINS": "Jenkins",
      "K8S": "Kubernetes / k3d",
      "POSTGRES": "PostgreSQL",
      "MONGO": "MongoDB",
      "GRAFANA": "Grafana/Prometheus",
      "DOCKER": "Docker"
    },
    "XP": {
      "COMPANY9": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Senior Software Engineer",
        "TIME": "Mar. 2026 – now"
      },
      "COMPANY8": {
        "COMPANY": "Teraport GmbH",
        "ROLE": "Senior Software Developer / Architect",
        "TIME": "Feb. 2024 – Feb. 2026",
        "HIGHLIGHTS": {
          "P1": "Architecture and implementation of database connectivity using Hibernate 6.x.",
          "P2": "Design and development of a full-stack web application for collision analysis (Angular + Spring Boot + Docker).",
          "P3": "Development of a cost analysis tool called MIDO."
        }
      },
      "COMPANY7": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Lead Software Developer",
        "TIME": "Mar. 2023 – Dec. 2023",
        "HIGHLIGHTS": {
          "P1": "Planning a new cloud architecture to migrate a large legacy monolith to a modern microservice-based platform.",
          "P2": "Led the development team of three to four backend engineers.",
          "P3": "Collaborated with partners and customers on integrating their systems with the DMIx."
        }
      },
      "COMPANY6": {
        "COMPANY": "ColorDigital GmbH",
        "ROLE": "Senior Software Developer",
        "TIME": "Mar. 2021 – Mar. 2023",
        "HIGHLIGHTS": {
          "P1": "Worked on the DMIx core cloud, including the implementation of an Elasticsearch-based real-time search module.",
          "P2": "Implementation of a new browser tool called 'Moodboard' (Node.js + Vue.js).",
          "P3": "Development of 'PAX', a tool for data exchange between the DMIx cloud and customer PLM/ERP systems, including CI/CD integration."
        }
      },
      "COMPANY5": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Team leadership",
        "TIME": "Sep. 2015 – Feb. 2021",
        "HIGHLIGHTS": {
          "P1": "Team lead of the Vidya software department, including disciplinary responsibility and interviews.",
          "P2": "Led several projects with external partners and freelancers.",
          "P3": "Managed strategic initiatives in 3D software development."
        }
      },
      "COMPANY4": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Software engineer",
        "TIME": "Apr. 2010 – Feb. 2021",
        "HIGHLIGHTS": {
          "P1": "Worked on core technologies such as algorithms, simulation, rendering, and collision detection.",
          "P2": "Used technologies including Java, OpenCL, OpenGL, GLSL shaders, C++, and REST interfaces.",
          "P3": "Participated in national and international research projects (EU7 and ZIM)."
        }
      },
      "COMPANY3": {
        "COMPANY": "Assyst GmbH",
        "ROLE": "Internship and Diploma",
        "TIME": "Apr. 2009 – Apr. 2010",
        "HIGHLIGHTS": {
          "P1": "Implemented production features in the real-time cloth simulation software Vidya.",
          "P2": "Conducted research and literature review for the diploma thesis.",
          "P3": "Successfully implemented the diploma topic in Vidya."
        }
      },
      "COMPANY2": {
        "COMPANY": "TH Bingen (University of Applied Sciences)",
        "ROLE": "Tutorial for fundamentals of Java programming",
        "TIME": "Apr. 2008 – Aug. 2008",
        "HIGHLIGHTS": {
          "P1": "Preparation of practical and theoretical course material.",
          "P2": "Held a 20-hour lecture series for the bioinformatics programme.",
          "P3": "Provided assistance during practical programming exercises."
        }
      },
      "COMPANY1": {
        "COMPANY": "TH Bingen (University of Applied Sciences)",
        "ROLE": "Research Asssitent",
        "TIME": "Oct. 2007 – Apr. 2008",
        "HIGHLIGHTS": {
          "P1": "Evaluation of various Web 2.0 technologies.",
          "P2": "Implementation of a Java-based interface for Microsoft Excel.",
          "P3": "Integration of the MIT Exhibit framework and preparation for CeBIT 2008."
        }
      },
      "COMPANY0": {
        "COMPANY": "Chamaeleon AG",
        "ROLE": "Training as an IT specialist in application development",
        "TIME": "Jul. 2002 – Jun. 2005",
        "HIGHLIGHTS": {
          "P1": "Development in PERL, PHP and ASP.",
          "P2": "Portierung, Wartung und Reengineering von bestender Software.",
          "P3": "Regular performance of system tests and quality controls, as well as their documentation."
        }
      }
    },
    "PROJECT": {
      "P2": {
        "TITLE": "Playground",
        "DESCRIPTION": "This project is, as the name suggests, a personal playground that will grow over time. It showcases various private projects I’m working on and documents their progress, key ideas, and milestones.",
        "LINK_EXTERNAL": "andreas-dahm.eu",
        "LINK_INTERNAL": "Project details",
        "HIGHLIGHTS": {
          "P1": "Using modern technologies and CI/CD pipelines (Angular 20+, Spring Boot 4, GitHub).",
          "P2": "Showcasing personal projects and improving algorithmic skills over time.",
          "P3": "Deepening knowledge in JavaScript/TypeScript, Angular, Spring Boot and related technologies through hands-on practice."
        }
      },
      "P1": {
        "TITLE": "El Mucho",
        "DESCRIPTION": "This is my first published game on Steam. I developed it together with my brother, fulfilling one of my personal goals: creating and releasing my own video game.",
        "LINK_EXTERNAL": "Steam Store",
        "LINK_INTERNAL": "Project details",
        "HIGHLIGHTS": {
          "P1": "Publishing a game on Steam and integrating the Steam API.",
          "P2": "Designing, planning and developing a complete game from scratch.",
          "P3": "Implementing complex algorithms, including a custom A* pathfinding system and game AI logic."
        }
      },
      "P0": {
        "TITLE": "Game Jams",
        "DESCRIPTION": "This section showcases several of my past game jam creations. Game jams are a great way to explore new game ideas and quickly validate whether a game loop works. The tight time constraints force you to focus, and it’s always exciting to see what can be achieved within such a short timeframe.",
        "LINK_EXTERNAL": "Itch.io Collection",
        "LINK_INTERNAL": "Project details",
        "HIGHLIGHTS": {
          "P1": "Planning a realistic project scope with a team that can be built within 48 hours.",
          "P2": "Learning to stay focused and work effectively under strict time constraints.",
          "P3": "Experiencing the joy of creating a playable game in a short timeframe and seeing others enjoy it."
        }
      },
      "DIPLOMA": {
        "TITLE": "Diploma thesis - Collision detection and handling of complex garments.",
        "DESCRIPTION": "The thesis deals with the detection and handling of collisions between and within individual items of clothing in real time. This is particularly challenging due to the flexibility of fabrics and their varying properties.",
        "LINK_INTERNAL": "Project details",
        "HIGHLIGHTS": {
          "P1": "Real-time handling of collision detection and response.",
          "P2": "Understanding and evaluating scientific papers.",
          "P3": "Adaptation and further development of previous research work."
        }
      },
      "TRIBBLE": {
        "TITLE": "Homeserver 'Tribble'",
        "DESCRIPTION": "This project is about setting up and maintaining my own homeserver. It runs several Docker containers like Gitea, Jellyfin and more. It's a great learning experience in self-hosting and system administration.",
        "LINK_INTERNAL": "Project details",
        "HIGHLIGHTS": {
          "P1": "Self-hosting of various services using Docker.",
          "P2": "CI/CD pipeline for the personal website using Gitea.",
          "P3": "Secure remote access with Tailscale and Traefik."
        }
      }
    },
    "EDUCATION": {
      "E6": {
        "WHERE": "FH Bingen (University of Applied Sciences)",
        "WHEN": "2006 – 2010",
        "WHAT": "Diploma (FH), Applied Computer Science (final grade 1.4)"
      },
      "E5": {
        "WHERE": "FH Koblenz (University of Applied Sciences)",
        "WHEN": "2005 – 2006",
        "WHAT": "1 semester of Engineering Informatics"
      },
      "E4": {
        "WHERE": "BBS Montabaur",
        "WHEN": "2002 – 2005",
        "WHAT": "Apprenticeship as IT Specialist for Application Development"
      },
      "E3": {
        "WHERE": "BBS Andernach – Higher Vocational School (Computer Science)",
        "WHEN": "2000 – 2002",
        "WHAT": "University entrance qualification (Fachhochschulreife)"
      },
      "E2": {
        "WHERE": "BBS Andernach – Vocational School for Technology (Electrical Engineering)",
        "WHEN": "1998 – 2000",
        "WHAT": "Secondary school certificate (Realschulabschluss)"
      },
      "E1": {
        "WHERE": "Hauptschule Hinter Burg Mayen (Albert Schweitzer Realschule Plus)",
        "WHEN": "1995 – 1998",
        "WHAT": "Lower secondary school certificate (Hauptschulabschluss)"
      },
      "E0": {
        "WHERE": "Albert Schweitzer Realschule Mayen",
        "WHEN": "1993 – 1995",
        "WHAT": "No degree (transferred to lower secondary school)"
      }
    }
  },
  "PROJECTS": {
    "DOWNLOAD": "Download",
    "READ_MORE": "Read More",
    "LINK_TO_PROJECT": "To the project",
    "CLOSE": "Close",
    "SECTION": {
      "TECHNICAL": "Technical Challenges",
      "LEARNINGS": "Learnings & Soft Skills"
    },
    "PLAYGROUND": {
      "TITLE": "Playground Portfolio",
      "SHORT_DESCRIPTION": "Full-stack portfolio with interactive algorithm visualizations.",
      "INTRODUCTION": "This website serves as a living portfolio and testing ground for modern web technologies. The goal is to clearly represent complex algorithms and mathematical concepts (such as WebGPU simulations or Raymarching) directly in the browser.",
      "BULLET_1": "Development with Angular 19+ and Material Design.",
      "BULLET_2": "Implementation of performant visualizations (WebGPU, Shader, Canvas).",
      "BULLET_3": "Automated CI/CD pipelines and containerization with Docker.",
      "BULLET_4": "Internationalization (i18n) for global reach.",
      "CHALLENGE_1": "Optimizing render performance for complex 3D fractals in real-time.",
      "CHALLENGE_2": "Architecting a scalable and maintainable frontend structure for diverse sub-projects.",
      "LEARNING_1": "Effective UI/UX design for complex data-driven visualizations.",
      "LEARNING_2": "Advanced state management and reactive programming in Angular."
    },
    "TRIBBLE": {
      "TITLE": "Self-Hosted Infrastructure",
      "SHORT_DESCRIPTION": "Home infrastructure with Docker, Traefik, and secure VPN connectivity.",
      "INTRODUCTION": "Documentation and construction of a private cloud infrastructure. Focus is on data sovereignty, automation, and security.",
      "BULLET_1": "Central management via Docker-Compose and Portainer.",
      "BULLET_2": "Automatic SSL management and reverse proxy with Traefik.",
      "BULLET_3": "Private version control (Gitea) and media streaming (Jellyfin).",
      "BULLET_4": "Network-wide ad-blocking and DNS control via AdGuard Home.",
      "CHALLENGE_1": "Configuring secure network layers and firewall rules for remote access.",
      "CHALLENGE_2": "Automating backups and recovery strategies for containerized data.",
      "LEARNING_1": "Deep understanding of modern network protocols and IT security.",
      "LEARNING_2": "Efficient resource management on limited server systems."
    },
    "EL_MUCHO": {
      "TITLE": "El Mucho (Steam Release)",
      "SHORT_DESCRIPTION": "Turn-based tactical RPG, published on Steam.",
      "INTRODUCTION": "A commercial game project that was independently implemented from the initial idea to the worldwide release on Steam. A tactical RPG that combines classic gameplay elements with modern systems.",
      "BULLET_1": "Complete engine development in Unity (C#).",
      "BULLET_2": "Integration of Steamworks features (Achievements, Cloud Saves).",
      "BULLET_3": "Development of a custom tactical AI and pathfinding logic.",
      "BULLET_4": "Management of the entire asset pipeline and sound design.",
      "CHALLENGE_1": "Implementing a robust turn-based system with complex dependencies.",
      "CHALLENGE_2": "Performance optimization for a smooth experience across various hardware profiles.",
      "CHALLENGE_3": "Handling Steam's strict certification requirements.",
      "LEARNING_1": "Perseverance and focus over a multi-year development cycle.",
      "LEARNING_2": "Marketing and community management for a digital product."
    },
    "GAME_JAMS": {
      "TITLE": "Rapid Prototyping & Game Jams",
      "SHORT_DESCRIPTION": "Collection of innovative game concepts, created in under 48 hours.",
      "INTRODUCTION": "Participation in national competitions (e.g. BeansJam). The focus is on creating functional and fun prototypes under extreme time pressure.",
      "BULLET_1": "Focus on 'Core Game Loop' and fast feedback.",
      "BULLET_2": "Collaborative development in small, agile teams.",
      "BULLET_3": "Effective time management and scope control.",
      "BULLET_4": "Publishing and iteration based on community voting.",
      "CHALLENGE_1": "Reducing complex ideas to a Minimum Viable Product (MVP) achievable in 48h.",
      "CHALLENGE_2": "Rapid bug diagnosis and fixing under massive time pressure.",
      "LEARNING_1": "Radical prioritization of features ('Kill your darlings').",
      "LEARNING_2": "Effective communication and decision-making under team stress."
    },
    "DIPLOMA": {
      "TITLE": "Scientific Diploma Thesis",
      "SHORT_DESCRIPTION": "Real-time collision detection for complex, flexible 3D objects.",
      "INTRODUCTION": "Research work in the field of computer graphics. Development of an algorithm for physically correct simulation of fabrics and clothing in real-time.",
      "BULLET_1": "Mathematical modeling of mass-spring systems.",
      "BULLET_2": "Low-level programming with Java.",
      "BULLET_3": "Optimization through spatial data structures (AABB Trees, Bounding Spheres).",
      "BULLET_4": "Scientific evaluation of simulation precision.",
      "CHALLENGE_1": "Handling 'self-collisions' in high-resolution meshes without performance loss.",
      "CHALLENGE_2": "Mathematical stabilization of integration methods under high force impacts.",
      "LEARNING_1": "Transferring theoretical research into productive, high-performance code.",
      "LEARNING_2": "Precise working and documentation according to scientific standards."
    }
  },
  "IMPRINT": {
    "TITLE" : "Imprint",
    "PARAGRAPH": "Information pursuant to Section 5 DDG",
    "COUNTRY": "Germany",
    "CONTACT": "Contact"
  },
  "PATHFINDING": {
    "TITLE": "Pathfinding Algorithms",
    "START_NODE": "Start Node",
    "END_NODE": "End Node",
    "WALL": "Wall",
    "CLEAR_NODE": "Clear",
    "DIJKSTRA": "Start Dijkstra",
    "ASTAR": "Start A*",
    "NORMAL_CASE": "Test Scenario",
    "EDGE_CASE": "A* Edge Case Scenario",
    "RANDOM_CASE": "Random Case",
    "CLEAR_BOARD": "Empty Board",
    "VISITED": "Visited",
    "PATH": "Path",
    "PATH_LENGTH": "Path length",
    "EXECUTION_TIME": "Execution Time",
    "EXPLANATION": {
      "TITLE": "Algorithms",
      "DIJKSTRA_EXPLANATION": " is guaranteed to find the shortest path if all edge costs are non-negative. Advantage: optimal and without heuristics. Disadvantage: often visits a large number of nodes (can be slower for large grids).",
      "ASTAR_EXPLANATION": " extends Dijkstra with a heuristic (e.g. Manhattan distance) and can therefore search in a much more targeted manner. Advantage: often significantly faster with good heuristics; with permissible heuristics, the path remains optimal. Disadvantage: highly dependent on heuristics (poor heuristics ≈ Dijkstra).",
      "DISCLAIMER": "This A* implementation is deliberately kept simple. It only moves in four directions and each step costs 1. The heuristic is minimal and only serves to demonstrate the principle of A* compared to Dijkstra. The goal is not an optimal or production-ready A* algorithm, but a clear visualisation of how heuristics can speed up the search."
    },
    "ALERT": {
      "START_END_NODES": "Please select a start and end node before running the algorithm."
    }
  },
  "SORTING": {
    "TITLE": "Sorting Algorithms",
    "ALGORITHM": "Algorithm",
    "START": "Start Sorting",
    "RESET": "Reset",
    "GENERATE_NEW_ARRAY": "Generate New Array",
    "EXECUTION_TIME": "Execution Time",
    "ARRAY_SIZE": "Number of Bars",
    "EXPLANATION": {
      "TITLE": "Algorithms",
      "BUBBLE_SORT_EXPLANATION": "repeatedly compares adjacent elements and swaps them if they are in the wrong order. The largest element \"bubbles\" to the end of the list like an air bubble. Advantage: Extremely simple to understand and implement; detects already sorted lists very quickly. Disadvantage: Very inefficient for large lists (runtime O(n²)). Rarely used in practice.",
      "QUICK_SORT_EXPLANATION": "follows the \"divide and conquer\" principle. A \"pivot\" element is selected, and the array is divided into two halves: elements smaller than the pivot and elements larger than the pivot. Advantage: On average one of the fastest sorting algorithms (O(n log n)); requires no additional memory (in-place). Disadvantage: Slow in the worst case (O(n²)) if the pivot is chosen poorly. Is not stable (changes order of equal elements).",
      "HEAP_SORT_EXPLANATION": "organizes the data initially into a special tree structure (Binary Heap). The largest element (the root) is extracted and sorted to the end, then the tree is repaired. Advantage: Guarantees a fast runtime of O(n log n), even in the worst case. Requires almost no additional memory. Disadvantage: Often slightly slower than Quick Sort in practice because the jumps in memory (heap structure) utilize the CPU cache less effectively.",
      "DISCLAIMER": "The choice of the \"best\" sorting algorithm depends heavily on the data and the constraints. In computer science, three scenarios are often considered:",
      "DISCLAIMER_1": "Best Case: The data is already nearly sorted (Bubble Sort shines here, for example).",
      "DISCLAIMER_2": "Average Case: The statistical norm.",
      "DISCLAIMER_3": "Worst Case: The data is arranged in the most unfavorable way possible (Quick Sort performs poorly here without optimization, while Heap Sort remains stable).",
      "DISCLAIMER_4": "Additionally, there is almost always a Time-Space Trade-off: Algorithms that are extremely fast (like Merge Sort) often require a lot of additional working memory. Algorithms that work directly in existing memory (like Heap Sort) save space but are sometimes more complex or slightly slower. Thus, there is no \"one-size-fits-all\" solution."
    }
  },
  "GOL": {
    "TITLE": "Conway's Game of Life",
    "START": "Start",
    "PAUSE": "Pause",
    "RANDOM_SCENE": "Random",
    "EMPTY_SCENE": "Empty",
    "SIMPLE_SCENE": "Glider",
    "PULSAR_SCENE": "Pulsar",
    "GUN_SCENE": "Gun",
    "ALIVE": "Alive",
    "DEAD": "Empty",
    "SPEED": "Time per Generation",
    "EXPLANATION": {
      "TITLE": "Explanation",
      "EXPLANATION": "The game proceeds step by step. First, an initial generation of living cells is defined on the playing field. From the current generation (the overall state of the playing field), the next generation is determined. The state of each individual cell in the next generation is derived from simple rules based on its current state and the current states of its eight neighboring cells (Moore neighborhood).",
      "DISCLAIMER": "According to Conway’s original rule, a cell is alive in the next round if exactly three cells are alive in its 3x3 neighborhood beforehand, counting itself only if necessary, that is:",
      "DISCLAIMER_1": "A living cell remains alive in the next generation if it has either two or three living neighbors.",
      "DISCLAIMER_2": "A dead cell is “born” (is alive in the next generation) if it has exactly three living neighbors.",
      "DISCLAIMER_3": "A living cell “dies” (is dead in the next generation) if it has fewer than two (underpopulation) or more than three (overpopulation) living neighbors.",
      "DISCLAIMER_4": "A dead cell remains dead if it does not have exactly three living neighbors."
    }
  },
  "LABYRINTH": {
    "TITLE": "Labyrinth Generation",
    "PRIM": "Generate Prim's Labyrinth",
    "KRUSKAL": "Generate Kruskal's Labyrinth",
    "EXPLANATION": {
      "TITLE": "Algorithms",
      "PRIM_EXPLANATION": "starts at a random point and expands the labyrinth by always selecting a random neighboring wall of an already visited cell and opening it. Advantage: Produces very uniform, natural-looking labyrinths with many short dead ends. Visually, it appears like organic growth from a central point.",
      "KRUSKAL_EXPLANATION": "considers all walls of the grid as potential paths. It randomly selects walls and opens them only if the two adjacent cells are not yet connected (preventing cycles). Advantage: Produces a very complex labyrinth with many long, winding paths. Visually, it is engaging because the labyrinth emerges simultaneously in many places and eventually merges into a whole.",
      "DISCLAIMER": "Both algorithms are based on the principle of the 'Minimum Spanning Tree'. This means for your labyrinth:",
      "DISCLAIMER_1": "Perfect labyrinth: There are no closed loops – every point is reachable, but there is always exactly one path between any two points.",
      "DISCLAIMER_2": "Reachability: Since it is a spanning tree, every cell in the grid is guaranteed to be part of the labyrinth; there are no isolated areas.",
      "DISCLAIMER_3": "Randomness: By weighting the edges with random values, each run produces completely new, unique structures.",
      "DISCLAIMER_4": "Application: Such labyrinths are the perfect test environment for pathfinding algorithms such as Dijkstra or A*."
    }
  },
  "FRACTAL": {
    "TITLE": "Fractals",
    "ALGORITHM": "Algorithms",
    "RESET": "Reset",
    "COLOR_SCHEME": "Color Scheme",
    "MAX_ITERATION": "Max. Resolution",
    "EXPLANATION": {
      "TITLE": "Mathematical Art",
      "MANDELBROT_EXPLANATION": "is based on the iterative formula 'z_{n+1} = z_n^2 + c'. It checks for every point in the complex plane whether the sequence remains stable or escapes to infinity. Advantage: Known as the 'Apple Man', it is the mother of all fractals, offering infinite variety and self-similar structures to zoom into forever.",
      "JULIA_EXPLANATION": "uses the same formula as Mandelbrot but fixes the parameter 'c' and varies the starting value. Depending on the choice of 'c', it creates delicate, cloud-like structures or disconnected 'dust'. Advantage: Allows for immense aesthetic variance, as every coordinate in the Mandelbrot set produces its own unique Julia fractal.",
      "NEWTON_EXPLANATION": "is created by visualizing Newton's method for finding roots of a complex function. Each pixel is colored based on which root the algorithm converges to. Advantage: Produces fascinating star-shaped symmetries and complex boundaries where the attraction basins of the roots meet in a chaotic dance.",
      "BURNING_SHIP_EXPLANATION": "is a variation of the Mandelbrot set where the absolute values of the real and imaginary parts are taken before each iteration: '(|Re(z)| + i|Im(z)|)^2 + c'. Advantage: Generates a striking, asymmetrical structure resembling a ship on fire. It feels more 'mechanical' and darker compared to the classical sets.",
      "DISCLAIMER": "All these fractals are based on the principle of iteration and the butterfly effect. This means for your visualization:",
      "DISCLAIMER_1": "Infinite Depth: No matter how far you zoom in, new complex structures appear that often resemble the whole (self-similarity).",
      "DISCLAIMER_2": "Escape-Time Algorithm: Colors usually represent how quickly a sequence exceeds a certain threshold—the faster it escapes, the 'hotter' or brighter the color.",
      "DISCLAIMER_3": "Complex Numbers: Calculations don't happen in a standard coordinate system, but in the complex plane using real and imaginary components.",
      "DISCLAIMER_4": "Computational Load: Since hundreds of calculations are performed for every single pixel, fractals are a classic benchmark for GPU and processor performance.",
      "DISCLAIMER_BOTTOM": "Graphics cards calculate with 32-bit floating point numbers (float) by default. These only have about 7 digits of accuracy. At very high zoom levels (> 100.000), the difference between two pixels is so tiny that the graphics card can no longer display it. It calculates exactly the same value for 10 pixels next to each other -> you see blocks or stair steps."
    }
  },
  "FRACTAL3D": {
    "TITLE": "3D Fractals",
    "ALGORITHM": "Algorithms",
    "MANDELBULB": "Mandelbulb",
    "MANDELBOX": "Mandelbox",
    "JULIA": "Julia",
    "EXPLANATION": {
      "TITLE": "3D Fractal Worlds",
      "MANDELBULB_EXPLANATION": "is considered the 'Holy Grail' of 3D fractals. Since complex numbers are only two-dimensional, this fractal uses spherical coordinates and high powers (usually v^8 + c) to project the Mandelbrot set into 3D space. Benefit: Creates an organic, extremely detailed structure reminiscent of plants, coral reefs, or alien landscapes.",
      "MANDELBOX_EXPLANATION": "is based not on smooth curves, but on geometric 'folding' and scaling (Box-Folding & Sphere-Folding). Space is repeatedly folded and mirrored like origami. Benefit: Produces strictly geometric, mechanical-looking structures that resemble endless futuristic cities, the Borg cube, or complex sci-fi architecture.",
      "JULIA_EXPLANATION": "is the 3D counterpart to the 2D Julia set. While the Mandelbulb is a 'map' of all fractals, here we fix the parameter 'c' and vary the starting point and it changes over time. Benefit: Unlike the solid Mandelbulb, Julia Bulbs are often hollow, forming complex tunnel systems or bubble-like structures perfect for flying through with the camera.",
      "DISCLAIMER": "This visualization uses a technique called 'Raymarching' (Sphere Tracing). This means:",
      "DISCLAIMER_1": "No Polygons: There are no triangles or meshes. The shape is calculated mathematically for every pixel in real-time.",
      "DISCLAIMER_2": "Distance Estimation: The algorithm 'marches' light rays forward by calculating the safe distance to the nearest object without hitting it immediately.",
      "DISCLAIMER_3": "Infinite Detail: Since the surface is mathematically defined, it never pixelates when zooming in – new structures always emerge.",
      "DISCLAIMER_4": "Light & Shadow: To visualize depth, light reflections and shadows (Ambient Occlusion) are simulated based on the curvature of the formula."
    }
  },
  "PENDULUM": {
    "TITLE": "Double pendulum",
    "TRAIL_DECAY_TIME": "Trail length",
    "DAMPING": "Damping",
    "ATTRACTION": "Attraction",
    "L1_LENGTH": "Length L1",
    "L2_LENGTH": "Length L2",
    "M1_MASS": "Mass M1",
    "M2_MASS": "Masse M2",
    "POKE_M1": "Poke M1",
    "POKE_M2": "Poke M2",
    "RESET": "Reset",
    "EXPLANATION": {
      "TITLE": "Chaos Theory: The Double Pendulum",
      "EXPLANATION": "The double pendulum is one of physics' most famous and fascinating examples of a dynamic system that generates 'deterministic chaos'. It simply consists of a standard pendulum with a second pendulum attached to its lower end. Although the underlying laws of classical mechanics are strictly mathematically defined, the long-term behavior of the double pendulum is absolutely unpredictable. In physics, it is considered the classic showcase object for the so-called butterfly effect.",
      "DISCLAIMER": "This WebGPU simulation calculates the motion and acceleration equations of the pendulum 60 times per second in real-time. The following characteristics apply:",
      "DISCLAIMER_1": "Extreme Sensitivity: The tiniest changes in the initial conditions (e.g., a thousandth of a degree deviation in the starting angle or mass) lead to a completely different, chaotic trajectory after just a short time.",
      "DISCLAIMER_2": "Deterministic Chaos: The movement may look completely wild and random, but it isn't. If you restart the simulation with the exact same values, the pendulum will follow 100% the same path.",
      "DISCLAIMER_3": "Numerical Integration: Since computers do not calculate time continuously but in tiny steps (dt), minute mathematical rounding errors occur in every frame. These add up over time and further influence the chaos.",
      "DISCLAIMER_4": "Energy Conservation & Friction: In a perfect physical system without resistance, the pendulum would swing forever. For a natural look, the algorithm uses an artificial damping factor that simulates air friction and eventually brings the system to a halt.",
      "DISCLAIMER_BOTTOM": "NOTE: If too many impulses are fed into the system, the simulation becomes unstable. The pendulum will then just hang down and the simulation will have to be restarted."
    }
  },
  "CLOTH": {
    "TITLE": "Cloth simulation",
    "WIND_ON": "Wind On",
    "WIND_OFF": "Wind Off",
    "OUTLINE_ON": "Show Mesh",
    "OUTLINE_OFF": "Hide Mesh",
    "EXPLANATION": {
      "TITLE": "Real-time Cloth Simulation on the GPU",
      "CLOTH_SIMULATION_EXPLANATION_TITLE": "Cloth Simulation",
      "XPBD_EXPLANATION_TITLE": "XPBD (Extended Position-Based Dynamics)",
      "GPU_PARALLELIZATION_EXPLANATION_TITLE": "GPU Parallelization",
      "DATA_STRUCTURES_EXPLANATION_TITLE": "Data Structures",
      "CLOTH_SIMULATION_EXPLANATION": "Cloth simulations usually model textiles as a grid of mass points (vertices) held together by invisible connections. The goal is to represent physical influences like gravity, wind, and collisions in real time without the material tearing or stretching unnaturally like rubber.",
      "XPBD_EXPLANATION": "XPBD (Extended Position-Based Dynamics) is a modern algorithm that manipulates point positions directly to satisfy distance conditions (constraints) instead of calculating accelerations. The 'Extended' means that true physical stiffness is simulated independently of the framerate. Advantage: Absolutely stable, does not explode, and topological changes (like cutting cloth) are trivial. Disadvantage: It is an iterative approximation method and slightly less physically accurate than complex matrix solvers.",
      "GPU_PARALLELIZATION_EXPLANATION": "To calculate tens of thousands of points in parallel on the graphics card, one must prevent 'race conditions' – i.e., two processing cores shifting the same node at the exact same time. The solution is called 'Independent Sets' (or Graph Coloring): The connections are divided into isolated groups (e.g., 4 phases for a 2D grid) in which not a single point overlaps. This allows the GPU to process each group blindly and at maximum speed.",
      "DATA_STRUCTURES_EXPLANATION": "For maximum GPU performance, data must be memory-aligned (16-byte alignment). Instead of using many individual variables, information is cleverly packed into blocks of four (vec4). A vertex stores, for example, [X, Y, Z, Inverse_Mass]. If a point has an inverse mass of 0.0, the algorithm ignores it, and it floats motionlessly in the air – an elegant trick for pinning cloth without extra if/then statements.",
      "DISCLAIMER": "XPBD vs. Mass-Spring Systems: In physical simulations, there are fundamental architectural differences when solving equations:",
      "DISCLAIMER_1": "Classical Mass-Spring Systems: Here, forces (Hooke's Law) are calculated, leading to accelerations and ultimately new positions. There are two ways to mathematically project these into the future (integration):",
      "DISCLAIMER_2": "Explicit Solvers (e.g., Forward Euler): These rigidly calculate the next step solely from the current state. They are easy to program but extremely unstable for stiff cloths. Forces can escalate and the simulation 'explodes' unless tiny, very performance-heavy time steps are chosen.",
      "DISCLAIMER_3": "Implicit Solvers (e.g., Backward Euler): These calculate the next step based on the future state. This is mathematically highly stable but requires solving massive global matrix equation systems in every frame. This is harder to parallelize on the GPU and breaks down if the structure changes (e.g., when the cloth is cut).",
      "DISCLAIMER_4": "The XPBD Compromise: XPBD completely bypasses this complex matrix problem by acting as a local solver. It combines the absolute stability of an implicit solver with the enormous speed, parallelizability, and dynamic adaptability of an explicit system."
    }
  },
  "ALGORITHM": {
    "TITLE": "Algorithms",
    "PATHFINDING": {
      "TITLE": "Pathfinding",
      "DESCRIPTION": "Comparing of Dijkstra vs. A*."
    },
    "SORTING": {
      "TITLE": "Sorting",
      "DESCRIPTION": "Visualizing various sorting algorithms."
    },
    "GOL": {
      "TITLE": "Conway's Game of Life",
      "DESCRIPTION": "The Game of Life is a cellular automaton devised by the British mathematician John Horton Conway in 1970."
    },
    "LABYRINTH": {
      "TITLE": "Maze Generation",
      "DESCRIPTION": "Visualizing various maze generation algorithms."
    },
    "FRACTAL": {
      "TITLE": "Fractals",
      "DESCRIPTION": "Visualisation of complex geometric patterns that resemble each other on increasingly smaller scales (self-similarity)."
    },
    "FRACTAL3D": {
      "TITLE": "Fractals 3D",
      "DESCRIPTION": "3D Visualisation of complex geometric patterns that resemble each other on increasingly smaller scales (self-similarity)."
    },
    "PENDULUM": {
      "TITLE": "Double pendulum",
      "DESCRIPTION": "Visualisation of a chaotic double pendulum simulation with WebGPU."
    },
    "CLOTH": {
      "TITLE": "Cloth simulation",
      "DESCRIPTION": "Simulation of cloth with WebGPU."
    },
    "NOTE": "Note",
    "GRID_HEIGHT": "Height",
    "GRID_WIDTH": "Width"
  }
}
