Welcome! Kurzlernen is a static playground of interactive learning experiments.
This combined README stitches together the playful per-file guides stored in the docs/ directory so you can browse everything from one place.
If you prefer the original short description, it now lives right below this intro.
Static website with interactive educational pages. Built and deployed via GitHub Pages.
cardio.html is a single-page workout journal that feels like a tiny game. It lets multiple users log cardio sessions, sprinkles in confetti when goals are hit, and keeps everything stored locally so progress sticks between visits.
- State – Every dropdown, slider, and table row is driven by a JavaScript state object. The helper
loadState()pulls it fromlocalStorage, andsaveState()writes back whenever something changes. - Energy model – Workouts are stored as watt-based intervals. The helper
getWattValue(level)translates the quick-entry slider level into watts, andcalculateCalories()uses body weight and duration to estimate burned energy. - Feedback loop – Actions funnel through friendly dialogs like
showConfirmDialog()andshowSuccessDialog(). Both wire up confetti viacreateConfetti()to make achievements feel celebratory.
- Header row: shows the page title, theme switcher (Tailwind + DaisyUI themes), and quick user selection.
- User settings: body weight and weekly target inputs store personal data in the same shared state.
- Quick-entry card: a range slider for watt level, preset duration buttons, and “Log Session” call-to-action for rapid capture.
- Statistics bar: mini cards summarizing weekly totals, daily streaks, and calorie output.
- Sessions table: responsive table with edit/delete actions and highlight animation for new rows.
- Add a new quick-entry button that logs a “cool-down” five-minute session at low wattage.
- Swap the DaisyUI theme to
draculaand watch the entire interface restyle instantly. - Change the weekly target to trigger the gamified progress indicators.
- All persistent data lives under the keys
z2-cardio-stateand a generateddeviceIdinlocalStorage. - Confetti elements are generated dynamically and removed after animations, so the DOM stays lean.
- The table is wrapped in
.sessions-table-containerto keep it scrollable on narrow screens. - Responsive tweaks kick in at
max-width: 420px, hiding non-essential columns to keep mobile usage pleasant.
In short, cardio.html is a joyful quantified-self logger that blends spreadsheets, party poppers, and progressive enhancement into one playful page.
This page is a geometry sandbox: drag to draw circles, right-click-drag to lay down lines, and tweak a grid to explore compass-and-straightedge constructions with modern mouse gestures.
- Coordinate capture – Mouse events track screen coordinates (
clientX/Y) and convert them into CSS positions. Every circle stores its center and radius so it can be redrawn precisely after undo/redo operations. - State history – A plain JavaScript array acts as an undo stack. Each drawn element is recorded with its class name and inline styles.
redrawFromHistory()rebuilds the DOM by replaying that stack. - Vector math – When you drag the live line or circle, the code uses
Math.atan2andMath.hypotto convert raw distances into angles and lengths. That keeps rendered lines and radius handles consistent even after panning or scaling.
- Left click + drag: define the center of a new measuring circle. Hold
Altto instantly stamp a circle using the last radius. - Right click + drag: draw straight lines between two points. Middle click enables viewport panning to explore large constructions.
- Ctrl + drag on a circle: resize it interactively. Each circle gets a red handle you can tug for fine adjustments.
- Grid controls: buttons in the corner nudge the spacing in five-pixel increments so you can align shapes precisely.
- Undo/redo: revisit your steps like in a drawing app—the script replays every stored element.
- Recreate a Euclidean triangle construction and then overlay the circumcircle using the circle handle.
- Increase the grid size dramatically to simulate zooming out, then use the panning gesture to navigate.
- Mix circles and red vectors to visualize complex-number addition: each vector is just a one-pixel-wide div rotated into place.
- The layout relies on absolutely positioned
<div>elements (.circle,.line,.vector) layered inside a full-screen container. - The
fixedPointmarker and ghost preview circle are reusable UI aids that appear while dragging. - No canvas is used—everything is DOM-based, making CSS-based styling or exporting to SVG straightforward.
This file turns geometry class into a tactile playground where lines and arcs obey the math you learned from first principles.
The CNAME file is a single-line text file that tells GitHub Pages which custom domain should point to this repository. In our case it contains the domain kurzlernen.de, so GitHub knows to serve the site when someone types that address into their browser.
Domain Name System (DNS) records map human-friendly names like kurzlernen.de to numeric IP addresses. GitHub Pages automatically hosts sites under <username>.github.io, but if we want to use our own domain we must register it and then prove to GitHub which domain belongs to this repository. The simplest proof is this CNAME declaration. When GitHub builds the site, it reads this file and configures its edge servers to respond to kurzlernen.de instead of the default address.
Think of the CNAME file as a VIP guest list. GitHub is the bouncer who only lets domains on the list access the private party (our website build). Without the CNAME, visitors would be directed to the generic entrance and our custom banner would never appear.
- The file must contain only the domain name and nothing else—no protocol (
https://) and no trailing spaces. - If you ever change domains, update this file and adjust your DNS provider’s
CNAMErecord to point to<username>.github.io. - Deleting the file reverts the site back to the default GitHub Pages domain.
- Custom domain registered with a DNS provider.
- DNS provider has a
CNAMErecord pointing tokurzlernen.github.ioor similar. - This repository contains the matching
CNAMEfile.
Keep this tiny file safe—without it the rest of the project would only shine on the default GitHub Pages address!
dawx.html is a standalone digital audio workstation experiment. It runs a deterministic drum-and-bass synthesizer entirely in JavaScript, favoring an AudioWorklet for low latency but shipping a ScriptProcessor fallback so it works everywhere.
- Global sample clock – The engine treats the sample index
nas truth. Beats are derived fromφ(n) = frac(n / samplesPerBeat), so every oscillator, envelope, and Euclidean rhythm stays sample-accurate without timers. - Procedural sound – Kick, snare, hat, and bass voices are generated mathematically in the worklet (
PhysEngine). Oscillators use polyBLEP anti-aliasing helpers (_saw,_square) while noise hits pass through digital filters like_hp(). - Deterministic randomness – A simple xorshift RNG seeded in the config means “random” timbres repeat exactly when reseeded. That is crucial for reproducible patterns.
- Graceful degradation – If
audioWorklet.addModulefails, the UI spins upPhysEngineDSP, a class mirroring the same DSP logic and pumping audio viaScriptProcessorNode.
- Transport panel:
Start/Stopbuttons light an LED showing whether audio is live and reveal the selected engine (worklet vs fallback). - Tempo + seed controls: update BPM, samples-per-beat, and RNG seed;
reseedbutton rerolls textures instantly. - Voice editors: each instrument has knobs/sliders for envelope, Euclidean step count/fill/rotation, and gain toggles.
- Scope canvases: draw time-domain waveforms of kick, snare, hat, and bass so you can “see” the sound.
- Disable the snare and increase the hat’s subdivision to hear shimmering polyrhythms.
- Switch the bass waveform to triangle, then crank the gate percentage to create staccato arpeggios.
- Drop the BPM while raising
snare.fillto turn the patch into glitchy ambient noise.
- The whole worklet source is embedded inside a
<script id="worklet">tag and registered viaregisterProcessor("phys-engine", ...). - UI widgets are standard
<input>elements; event handlers callengineDSP.set(inst, key, val)so the DSP state stays in sync for either backend. - The oscilloscope uses
AnalyserNodeFFT data andrequestAnimationFrameto continuously redraw. - Because everything hinges on the sample counter, tempo changes reset phase to avoid drift between instruments.
This page doubles as a DSP tutorial: it starts with the raw physics of wave equations and ends with a live sequencer you can tweak like a DJ.
draw.html is a lab instrument for tablets and touchscreens. It renders a full-screen SVG canvas and tracks every finger, showing live coordinates and trails so you can verify hardware accuracy or debug multi-touch gestures.
- Pointer capture – The page listens to
touchstart,touchmove,touchend, andtouchcancelevents on the<svg>element. Default gestures (touch-action) and text selection are disabled so raw coordinates come through untouched. - Vector display – Each active touch spawns a
<circle>inside the#touchPointsgroup. Radius and opacity reflect movement, and thedata-touch-idattribute ties DOM nodes to the browser’sidentifierproperty. - Logging – Every touch event is logged into
#debugWindow. The toggle button simply adds or removes the.showclass so testers can review the scrollable event stream without cluttering the UI.
- Instructions overlay reminds you which gestures to try.
- Debug button in the top-right corner opens the event console.
- SVG grid: background shading makes it easy to eyeball drift as you move.
- Perform a five-finger pinch and watch the circles shrink toward a common center.
- Hold one finger still while drawing with another to confirm separate touch IDs update independently.
- Toggle the debug window and copy the JSON-like logs into a bug report.
- Because everything lives in SVG, exporting a screenshot with
toDataURLwould be straightforward if needed. - The code intentionally uses
passive: falseon event listeners so it can callpreventDefault()and avoid scrolling. - Touch points fade out by removing them during
touchend; add easing or trails by storing previous positions in an array.
This page turns invisible finger data into bright circles so you can reason about touch input from the hardware layer up.
extrema.html visualizes how a sine wave emerges from a rotating vector. Sliders adjust the vector’s horizontal (period) and vertical (amplitude) components, and the canvas draws both the resulting wave and the vector that generates it.
- Vector rotation –
rotateVector(x, y, angle)converts slider values into a rotated basis using the classic rotation matrix[cos θ, -sin θ; sin θ, cos θ]. - Sampling the wave –
generateSinusFromVectorcomputes evenly spaced x-values from-2πto2πand evaluates the sine function with the rotated amplitude and period. This mirrors the formulay = A sin(2πx / T). - Rendering – The canvas is cleared each frame, axes are redrawn, and the blue sinusoid is plotted by mapping mathematical coordinates to screen space. The red vector extends to the first peak (period/4) so students can compare vector length and wave amplitude directly.
- X-Komponente slider manipulates the effective period: shorter values compress the wave, longer values stretch it.
- Y-Komponente slider controls amplitude: higher values create taller peaks and deeper valleys.
- Rotation slider spins the underlying vector while updating the on-screen value readout.
- Set the rotation to 90° and notice how the x- and y-components swap roles, flipping the wave’s phase.
- Try matching a desired period (e.g., two cycles across the canvas) by adjusting the x-component.
- Challenge students to predict the coordinate label displayed next to the red vector before it updates.
- Canvas scaling is handled manually: x-values scale by
width / (4π)and y-values byheight / 4to keep everything centered. - Slider events are bound with
inputlisteners so updates feel immediate. - Because everything is computed fresh each draw, you can add overlays (derivative curves, tangent lines) by extending
drawSinusCurve().
This file turns trigonometry into an interactive toy where vectors, waves, and rotations dance together.
extrema_rotation.html is a classroom-ready clone of the sinus explorer with emphasis on the rotation slider. It highlights how rotating a base vector changes both period and amplitude simultaneously, making phase shifts tangible.
- Input vector – Sliders start with
(2, 1)as the unrotated vector. That corresponds to a period of2 * 4 = 8units and amplitude1. - Rotation transform – The
rotateVectorhelper applies the standard 2D rotation matrix, producing the coordinates actually used to compute the wave. These rotated values are fed back into the slider readouts so students immediately see the numerical effect. - Wave generation –
generateSinusFromVectorsamples 500 points from-2πto2π, multiplies them by the rotated period, and maps the results to canvas pixels.
- Draw attention to the red vector anchored at the canvas center. Its length and orientation mirror the rotated vector driving the sine curve.
- Use the rotation slider to show phase shifts: at 180° the sine flips vertically, at 270° the amplitude appears negative.
- Pause at 45° and ask learners to compute the expected components before revealing the displayed
(x, y)label.
- Increase
pointsingenerateSinusFromVectorfor smoother lines if you ever expand the canvas width. - Change the baseline by editing the slider
min/maxvalues to explore extreme amplitudes or micro periods. - Add derivative curves or shaded extrema by extending
drawSinusCurve()—the structure leaves plenty of room.
- All event listeners use
inputevents so the wave updates continuously as the slider moves. - The canvas axes are redrawn each frame; extracting them into a helper would make it easier to add grid lines or labels.
- Because period is derived as
xKomponente * 4, the default vector ensures one full sine cycle fits nicely into the viewport.
Use this page when you want students to feel the algebra behind sinusoidal rotations, not just memorize formulas.
This page renders a pseudo-3D particle fluid simulation entirely on the GPU using WebGL. Thousands of particles flow inside a cubic box while sliders let you tune viscosity, damping, and pressure stiffness in real time.
- Particles – Each fluid parcel is a
Particleinstance with position, velocity, and color state. The initializer distributes them evenly across a grid, giving every cell a starting direction. - Advection –
streamParticles()advances positions by velocity each frame (p.position += p.velocity * dt). Boundary checks bounce particles off the cube walls by inverting velocities. - Collisions & pressure – Density is accumulated via
mapParticlesToGrid().applyPressureForces()compares each particle’s density to neighboring cells, nudging it away from overcrowded regions. ThepressureSliderscales those forces. - Viscosity –
applyViscosity()dampens velocity magnitude in smooth regions and re-randomizes direction when counts exceed theviscosityThreshold. That mimics how honey-like fluids resist shear.
- WebGL shaders draw each particle as a glowing point (
gl_PointSize = 8.0). - The projection + model-view matrices orbit the camera slowly so the cloud appears three-dimensional.
- Colors encode velocity magnitude—fast-moving particles glow warm, slower ones cool.
- Viscosity Threshold: how many particles must share a cell before the sim smears them together.
- Damping Factor: scales velocity retention each frame (
velocity *= damping). - Pressure Stiffness: increases repulsion in dense zones, preventing clumping.
- Reset Simulation: reinitializes particles with the latest parameter settings.
- Drop the damping to 0.5 and watch the fluid become energetic and chaotic.
- Raise viscosity to freeze sections into thick blobs—perfect to explain laminar vs turbulent flow.
- Pause the orbiting camera by setting
rotationSpeedto zero (search for therotationSpeedconstant) to examine internal structure.
- The simulation runs inside an animation loop capped with
requestAnimationFrameandperformance.now()time steps. - Physics and rendering share the same
particlesarray, so you can easily expandParticlewith temperature or pressure visuals. - WebGL buffer updates stream positions every frame; consider using instanced rendering if you raise the particle count dramatically.
This file is a mini fluid dynamics lab: tweak the knobs, observe emergent behavior, and connect slider math to real-world viscosity and pressure concepts.
This page builds fractals using Iterated Function Systems (IFS). You control up to four affine transformations, assign probabilities, choose colors, and then let a Web Worker crunch millions of points that paint onto a canvas you can zoom and pan.
- Affine transforms – Each transformation is represented by sliders
athroughf, encoding the matrix[a b; c d]and translation(e, f). These define how points are scaled, skewed, rotated, and moved. - Probability selection – Because each iteration randomly picks a transformation, the
probabilitiespanel ensures the sum equals 1. The UI auto-normalizes your inputs. - Web Worker acceleration – The heavy lifting happens off the main thread. A blob-based worker receives the transformation set, generates point batches, and posts them back. The main thread draws them with
ImageDatafor speed. - Color gradients – Each transformation has an associated color. During plotting, the worker blends colors across iterations, letting fern leaves fade from bright tips to shadowed stems.
- Transform cards: enable/disable transformations, adjust matrices, and preview their effect.
- Probabilities section: quick buttons to equalize weights or randomize them for exploration.
- Color palette: pick base hues, shuffle them, or load presets like Barnsley Fern or Sierpinski triangle.
- Export options: download PNGs, save parameter JSON, or copy shareable presets.
- Advanced insights: live statistics show bounding boxes, iteration counts, and runtime.
- Start with the Barnsley preset, then slightly tweak translation values to morph the fern into alien plants.
- Turn off one transformation to see how the attractor collapses and why each map is essential.
- Enable “auto zoom” to let the viewport follow the fractal’s bounding box as it evolves.
- The canvas uses
requestAnimationFramewhile dragging for smooth pan/zoom interactions, then snaps back to normal rendering. - Worker messages contain typed arrays for performance; keep them small if you add more metadata.
- Animation controls are scaffolded but intentionally left unimplemented—great stretch goal if you want to interpolate between presets.
Fractals emerge from simple linear algebra plus randomness. This tool invites you to tweak those primitives until stunning self-similar art appears.
geschichte.html is a full marketing funnel for an AI audio storytelling product. It starts with a glossy landing page (hero, pricing tiers, testimonials) and transitions into a hands-on story generator where visitors can enter prompts, synthesize narration, and download the result.
- Tailwind + DaisyUI – Styling is handled via CDN imports, letting the page adopt the
foresttheme with minimal CSS. Components like cards, buttons, and collapses come straight from DaisyUI classes. - Page switching –
showPage('landing' | 'generator')toggleshiddenclasses between the hero/pricing section and the generator UI. Smooth scrolling keeps navigation delightful. - Prompt workflow – When you click “Geschichte erstellen & anhören,” the script gathers the textarea value, builds a JSON payload, and sends it to the configured API endpoint via
fetch. - Status feedback – While waiting, a progress bar and status text appear. On success, the returned story HTML populates
#story-textand an audio URL feeds the<audio>player. Errors trigger toast notifications in#message-box.
- Hero: bold typography, call-to-action buttons, and background pattern.
- Pricing grid: three cards (Einzelkauf, Monatsabo, Autoren-Paket) with bullet lists and purchase buttons.
- Generator card: prompt textarea, generate button, loading indicators, result collapsible, and audio controls.
- Feature highlights: badges tout AI voice quality, editing tools, and concierge service.
- Swap the
data-themeattribute fromforesttonightfor a gothic vibe. - Modify the
apiUrlconstant to point to your own backend for rapid prototyping. - Add testimonials by cloning the existing card markup inside the features section.
- Toasts are created via
showToast(message, type)which injects DaisyUI alert markup and auto-hides it after 4 seconds. handleStoryGeneration()manages state toggles for loading and result containers; reuse it if you add more asynchronous calls.- Remember to secure API keys—
fetchcurrently expects the backend to handle authentication.
This file blends marketing polish with an interactive demo so visitors can go from curiosity to created story in minutes.
This dashboard models a “ladder” strategy for scratch-off lottery tickets. It tracks bankroll, safe withdrawals, Pfand (deposit bottle) reinvestments, and net loss across rounds—all stored offline so users can experiment with risk scenarios.
- State machine – A
stateobject keeps arrays of rounds, KPIs, and the active session flag. A dictionary ofSTORAGE_KEYSlets Normal and Pfand modes persist separately inlocalStorage. - Mode switching – Changing the
<select id="modeSelect">toggles Pfand-specific inputs and rehydrates state from the corresponding storage key. The UI updates KPIs and the history table instantly. - Round progression – Buttons “Einsatz gewonnen” and “Verloren” append round data with stake, winnings, delta, and updated totals. Business rules enforce when the safe bank grows vs when the play bank absorbs losses.
- Visual feedback – Tailwind utility classes create KPI cards, pill badges for current status, and a history table showing every round with trend arrows.
- Session control: start/end buttons prevent accidental logging outside an active series.
- Pfand helper: in Pfand mode the app converts bottle counts to euro stakes using the rule printed below the input.
- History timeline: a responsive table with per-round notes, automatically sorted newest-first.
- Dashboard badges: highlight hot streaks (three wins), cold streaks, or break-even points.
- Start with €10, toggle to Pfand mode, and see how the safe bank accumulates after each win.
- Simulate a losing streak and observe how the ladder rebuilds by reducing stake sizes.
- Reset the session and inspect the storage key in DevTools (
localStorage['rubbellos-ladder-normal']).
save()writes the entire state after every mutating action;load()gracefully handles empty storage by returning defaults.- KPI numbers are formatted via
formatCurrency()ensuring consistent two-decimal output. - The script leans on pure functions for calculations (
calculateStake,calculateSafeTransfer), making it easy to adjust strategy rules.
This page gamifies bankroll management so math-minded players can explore probabilities without risking real money.
index.html is the flagship learning companion. It guides a learner through three daily tasks—reading aloud, handwriting practice, and math drills—while tracking progress, capturing evidence, and rewarding completion.
- Task model –
storedTaskskeeps per-task state: recorded audio, uploaded handwriting proof, generated math problems, completion flags, and submission status. Everything is serialized tolocalStorageso sessions survive page reloads. - Timers + flow – Each task has start/stop buttons.
startTask()enforces that only one task runs at a time, whilestartTimer(taskIndex)drives countdowns and progress bars. On completion,checkAllTasksCompleted()unlocks the final submission step. - Media capture – Task 1 uses
navigator.mediaDevices.getUserMediaand RecordRTC to record speech. Task 2 accepts image uploads (handwriting proof) and stores them as base64 strings. JSZip + FileSaver bundle results for download when submitting. - Content seeding –
initializeTasks()seeds rich story text for reading, a copywork paragraph, and generates 10 math exercises (5 multiplication, 5 division) with integer answers. - User experience – DaisyUI components (cards, badges, progress bars) deliver a playful UI; a theme toggle flips between light/dark, and the 💩 button plays a celebratory fart with particle animation.
- Hit “Start Lesen & Aufnahme” to begin recording; timers and modals guide the flow.
- Upload a handwriting photo; the page previews it and marks the task complete.
- Solve math problems once Task 3 unlocks; answers validate in real time and persist.
- When all tasks are green, submit to generate a downloadable archive and lock the interface.
- Compatibility checks ensure MediaRecorder and JSZip exist; fall back gracefully for unsupported browsers.
- Toasts and modals reuse helper functions (
showToast,showValidationModal) for consistent feedback. - To localize, adjust the initial text constants or fetch from
texts.json(see that file’s README for context).
This page orchestrates audio, images, and math logic to make home study feel like a game backed by solid engineering fundamentals.
landing.html introduces the ops.impact coaching program. It’s a polished marketing page with responsive navigation, storytelling sections, and a contact call-to-action tailored for leadership culture work.
- Navigation – Sticky header with desktop links and a mobile hamburger. The script toggles the mobile menu’s
hiddenclass for a smooth slide-down experience. - Hero – Gradient text headline, supporting copy, and call-to-action buttons that scroll to the program and contact sections.
- Program pillars – Cards describe modules (Identität, Kultur, Führung, Klarheit) with checklists and icons.
- Essenz & Vorgehen – Split sections using Tailwind grids to explain methodology, including timeline steps and supportive imagery placeholders.
- Testimonials – Quote cards give social proof, styled with soft shadows and accent colors.
- Kontakt – Form with name, email, and message fields plus a “Fein abgestimmt” promise list.
- Tailwind config extends the color palette to match the brand. Everything else uses utility classes—no custom CSS frameworks required.
- Sticky CTA ensures the “Gespräch anfragen” button stays visible on large screens.
- Semantic structure (sections, headers, lists) keeps accessibility in mind while reinforcing the narrative flow from problem to solution.
- Swap out the accent colors in the Tailwind config to rapidly prototype different brand palettes.
- Hook the contact form to your backend or Zapier webhook—look for the
<form id="contact-form">to add event listeners. - Add subtle scroll-based animations by applying Tailwind’s
transitionutilities and toggling classes on intersection observers.
- The page uses Google Fonts’ Inter family for consistent typography across sections.
- Mobile/desktop nav share anchor targets; update section IDs if you rename headings.
- For SEO, adjust the
<meta name="description">to reflect the latest messaging.
This landing page is essentially a narrative arc: attention → insight → proof → invitation. Tweak the content blocks and you have a ready-made marketing funnel.
noise.html is the original iterated function system explorer. It renders fractals point-by-point on a canvas while letting you tweak up to three affine transformations and their probabilities.
- Affine maps – Sliders labelled A–F define transformation matrices just like in the enhanced version. Each transform can be toggled individually, allowing quick experiments with fewer functions.
- Random iteration –
generateIFSFractal()seeds a starting point and repeatedly applies a randomly selected transformation according to the probability sliders. The resulting coordinates are scaled into canvas space and plotted as single pixels. - Zoom controls – Buttons adjust a zoom factor and translation offsets, letting you dive into fractal detail without recomputing parameters.
- Color themes – Each transformation has a fixed color assignment. Blending is minimal, giving crisp triangular or fern-like patterns.
- Transform panels: a concise UI without the advanced sections from
fractals.html, ideal for teaching fundamentals. - Probability sliders: normalized automatically to sum to 1; a text indicator confirms the total.
- Reset + randomize: one-click ways to explore new shapes quickly.
- Disable all but one transformation to see how linear maps alone stretch the starting point.
- Gradually reintroduce additional transforms to watch the attractor emerge.
- Play with extreme shear values to create glitch-art effects.
- The rendering loop is synchronous; for millions of points consider adding a Web Worker (see the enhanced version for inspiration).
- Canvas resizing is manual—adjust width/height attributes for higher resolution exports.
- Because colors are basic, this is a good base for teaching palette generation or depth shading.
Use this page to grasp IFS fundamentals before diving into the feature-rich fractals.html upgrade.
oscigame.html visualizes Lissajous figures in 3D. Using Three.js, it traces the motion of two perpendicular oscillators and lets you manipulate frequency, amplitude, and phase with mouse gestures or keyboard shortcuts.
- Parametric motion – A trail of vertices is updated each frame based on
sin(2πf₁t + φ₁)andcos(2πf₂t + φ₂)with adjustable amplitudes. The path is drawn with a translucentTHREE.Linewhose alpha fades along the tail. - Interaction scheme – Right-click drag changes parameters: horizontal drags adjust cosine values, vertical drags sine values. Modifiers
AltandCtrltoggle between amplitude and phase adjustments; no modifier means frequency. - Camera control – WASD + QE keys move the camera freely (“shooter” controls). Press
Fto reset to the default orbit and restore oscillator defaults. - Center of mass – The script computes the mean position of recent points to keep the visualization centered and to aim the camera when resetting.
- Create knots by setting
frequencySin : frequencyCosto small integer ratios like 3:4. - Hold
Altand drag to exaggerate amplitudes, turning the pattern into a stretched ribbon. - Spin phases with
Ctrldrags to morph from sine/cosine alignment into swirling helices.
- Geometry buffers (
trailGeometry) are reused; positions and per-vertex alpha values are updated in place for performance. - Animation uses
requestAnimationFrameandDate.now()to compute elapsed time since reset. - Lighting (ambient + point light attached to the camera) keeps the trail glowing regardless of camera orientation.
This game lets learners feel how sine and cosine combine—by literally grabbing frequencies and phases and watching the math draw neon sculptures in the air.
oscillator.html is a sprawling physics playground: three synchronized oscillators, layered trails, Fourier analysis, and sound synthesis all live in one page. It’s built with Three.js for visuals and the Web Audio API for ear candy.
- Tabs as scenarios – The control panel hosts three tabs, each representing a preset experiment. Switching tabs swaps oscillator parameters, audio settings, and visualization meshes.
- Layered oscillators – Every tab controls green and yellow oscillators plus optional standing-wave and interference meshes. Global sliders adjust frequency, amplitude, and phase; layer-specific sliders fine-tune individual components.
- Phase locking –
updatePhaseLocking()enforces relationships like 1:2 or 3:5 between layers when the “phase lock” toggles are active. Changing the master slider automatically nudges dependents. - Audio integration – Each tab owns an
AudioContext, oscillator nodes, and analyser. Starting playback pipes the synth through aGainNodewhose output is visualized as a real-time bar graph. - Trails and energy panels – Trails store vertex buffers with fading colors. Energy distribution charts use analyser data to estimate kinetic/potential contributions for each axis.
- Control panel: collapsible sections for oscillator parameters, visualization toggles, audio controls, and presets.
- Canvas: pointer drag rotates the camera; scroll zooms; a toggle button hides the control panel for distraction-free viewing.
- Export hooks: placeholders exist for saving presets—extend the
savePresetfunction to serialize settings.
- Enable standing waves to see interference patterns build when phases align.
- Use the phase-locking matrix to create resonance (e.g., set yellow frequency to double green).
- Start audio playback and observe how the Fourier bars react to amplitude changes in real time.
- UI events ultimately call
updateLayerSliders(layer, parameter)to keep slider readouts synchronized with internal state. - Visual meshes share geometries across tabs to reduce GPU overhead; only attribute buffers change.
- Audio analyzers allocate
Uint8Arraybuffers per tab—reuse them if you add more tracks.
Treat this page as a digital lab bench: it mixes math, sound, and light so learners can experiment with oscillations holistically.
physics.html is a sandbox where you can design rigid-body scenes and run deterministic simulations. It combines an editor (add bodies, joints, forces) with a custom physics integrator—no external engine required.
- Body definitions – Objects are circles or polygons stored in the
bodiesarray with properties like mass, restitution, and color. The sidebar form populates these fields and pushes new bodies when you click “+ Add Object”. - Forces & constraints – Gravity, drag, and user-defined impulses are applied each frame. Joints link body pairs with configurable stiffness/damping, stored in the
jointsarray. - Deterministic stepper – A fixed timestep integrator updates positions and velocities using semi-implicit Euler. Because the timestep is constant, replaying the same sequence yields identical results.
- Collision handling – Broad-phase AABB checks precede narrow-phase collision resolution. Restitution and friction coefficients from the body data influence the response.
- Undo/redo – Editor actions push snapshots onto stacks so you can rewind design changes. Buttons in the corner are disabled when no history exists.
- Right sidebar: collapsible
<details>sections for world settings, objects, joints, and advanced tweaks (drag coefficients, contact solver iterations). - Canvas: double-click to select bodies, drag to reposition, and use hotkeys for quick duplication or deletion.
- Overlay widgets: FPS counter, pause/play, and toggles to show collision normals or bounding boxes.
- Build a Newton’s cradle by adding aligned circles, connecting them with joints, and tuning restitution.
- Increase solver iterations to see how stacking stability improves.
- Switch gravity to zero and enable drag to simulate space robotics manipulations.
- All state is plain JavaScript objects—perfect for exporting JSON or creating sharing links.
- Rendering uses Canvas 2D; physics and drawing are decoupled so you can swap in WebGL if desired.
- Determinism hinges on using
performance.now()only for diagnostics; physics updates rely on accumulated fixed timesteps.
With this file, you can teach mechanics from first principles: define forces, see outcomes, iterate.
physicssimple.html distills the full physics editor into an approachable demo. You spawn circles, fling them with deterministic velocities, toggle gravity, and watch them collide—all without fiddling with complex forms.
- Circle spawning – Right-click drops a circle with a seeded pseudo-random velocity so repeated experiments are reproducible. Hold
Altwhile dragging to choose the velocity vector manually. - Dragging – Left-click drag on an existing circle sets its new velocity based on drag distance, making momentum conservation intuitive.
- Deterministic updates – Like the full editor, the integrator runs on a fixed timestep. Resetting the simulation yields identical motion sequences if you repeat the same inputs.
- Collision resolution – Circles collide elastically with boundary walls and each other using simple impulse math tuned for clarity over realism.
- Instructions overlay enumerates every shortcut.
- Control panel toggles gravity, friction, restitution, and the deterministic seed.
- FPS counter ensures the browser keeps up with the calculations.
- Set gravity off, spawn a triangle of circles with equal velocities, and observe the conservation of momentum.
- Toggle gravity on mid-simulation to see how trajectories curve realistically.
- Adjust restitution to compare bouncy vs damped collisions.
- Code is cleanly separated into physics update, rendering, and input handlers—ideal for teaching how games structure loops.
- Deterministic randomness uses a seeded PRNG; tweak the seed slider to generate different but repeatable launch patterns.
- For extension, add polygon bodies by mimicking the circle data structure.
This file is perfect for first encounters with physics simulation: hands-on, repeatable, and friendly.
The top-level README.md is the front door to the repository. It introduces Kurzlernen as “Static website with interactive educational pages” and hints that the site is deployed with GitHub Pages. Simple, but mighty: this one sentence sets the expectation for newcomers who open the repo on GitHub.
From first principles, a README needs to answer three questions quickly: What is this? Can I use it? Where is it hosted? The existing text answers all three in a single breath. The GitHub UI already surrounds the file with repo metadata (stars, issues, license), so a succinct description avoids redundancy and lets curious readers dive straight into the code or the new per-file READMEs in this docs/ folder.
- New flagship features → Add a quick teaser so visitors know what’s new.
- Deployment changes → If the hosting platform or workflow changes, mention it here.
- Onboarding links → Link to documentation, issue templates, or the most popular interactive demos.
Want a tiny challenge? Try rewriting the root README in exactly three sentences: one for the vision, one for the technology, one for how to explore. That micro exercise keeps the message crisp and forces us to focus on what matters most.
In short: the root README.md is a minimalist lobby. The detailed guided tours live in the neighboring rooms you’re reading right now.
This app demonstrates how a noisy signal can still be reconstructed if you know the underlying sinusoid. Sliders control amplitude, frequency, phase, noise strength, and sample count; a Chart.js plot shows both noisy measurements and the reconstructed curve.
- Signal generation – Given
A,f, andφ, the script computesy = A sin(2π f t + φ)forNsamples. Uniform noise scaled bydataNoiseRangeAmplitudeis added to mimic measurement errors. - Encoding – The “save parameters” button exports the current settings and noisy data to JSON, illustrating how you might transmit the signal description instead of every sample.
- Reconstruction – Clicking “Kurve rekonstruieren” regenerates the clean sinusoid using the stored parameters and overlays it on the chart so learners can compare raw vs reconstructed data.
- Visualization – Chart.js handles rendering. The zoom plugin allows panning/zooming for detailed inspection of error bands.
- Sidebar cards provide tactile feedback for each slider value.
- Header buttons manage persistence: save parameters, load a JSON file, or rebuild the curve.
- Main panel contains the dual-line chart plus textual summaries (mean error, SNR) under the graph.
- Raise noise amplitude to 1.0 and observe how reconstruction still hugs the underlying sine because the model knows the phase.
- Reduce sample count to explore aliasing effects; challenge students to spot when the reconstruction diverges.
- Export parameters, reload the page, and use “Parameter laden” to showcase reproducibility.
- Parameters are stored in a simple object—extend it with polynomial terms or harmonics to teach Fourier decomposition.
- Chart datasets are updated in place, so the animation remains smooth even with frequent slider changes.
- Because the theme uses DaisyUI via CDN, customizing colors is as easy as switching the
data-themeattribute on<html>.
This tool connects abstract encoding theory with a tangible slider experiment: noisy data in, pristine reconstruction out.
stromkreis.html explains Ohm’s law through a friendly control panel and animated circuit. Learners adjust voltage, resistance, and wire gauge to see current flow, LED brightness, and recommended safety settings update instantly.
- Inputs – Sliders for voltage (0–24 V), resistance (1–100 Ω), and cable length feed the simulation. Toggle switches turn the circuit on/off and enable auto-configuration.
- Core equation –
updateCircuit()computes current viaI = V / R, power viaP = V * I, and voltage drop along the cable. These values populate cards and progress rings. - Visualization – CSS animations move glowing dots along a wire path to indicate electron flow. Resistance controls change resistor color/width, and LED brightness adjusts based on calculated current.
- Safety checks –
updateAWGRecommendation()maps current and cable length to a recommended wire gauge and flags when the chosen setup exceeds safe limits.
- Controls panel: grouped sliders and toggles with tooltips explaining each variable.
- Visual panel: schematic diagram with battery, resistor, LED, and animated current indicators.
- Formula block: highlights
V = I · Rplus derived quantities like power and voltage drop. - Explainer section: narrative text reinforcing how changing resistance impacts brightness.
- Turn on auto-mode to let the app choose a safe resistance, then override it to see how overheating warnings appear.
- Lower resistance gradually and note how the flow animation speeds up while the LED glows brighter.
- Increase cable length to watch the recommended wire gauge jump, teaching why long runs need thicker wires.
- State is centralized in
circuitState;setControlsState()keeps sliders and toggles synchronized when presets are loaded. - Animations use CSS keyframes; adjust durations to represent different current scales.
- DaisyUI/Tailwind classes provide the modern look, so customizing colors is as simple as editing the CSS variables at the top.
This page makes Ohm’s law tactile: tweak a knob, watch the “electrons” speed up, and connect math to physical intuition.
texts.json stores narrative snippets used by the learning tasks in index.html. It supplies both the reading passage and the copywork paragraph so the page can load content without hardcoding it directly.
{
"initialReadText": "<em>…</em>",
"initialWriteText": "<strong>…</strong>"
}- initialReadText: HTML-formatted story about discovering a mysterious diary. The text is rich with descriptive language, perfect for expressive reading practice.
- initialWriteText: Bold-labeled copywork assignment instructing learners to transcribe a key sentence from the story.
index.htmlreads these fields when initializing tasks, populating the reading card (#readText) and writing card (#writeText).- Because the strings include HTML tags, they render with emphasis and line breaks right out of the box.
- Replace the passages with seasonal stories or subject-specific texts to keep practice fresh.
- Add new fields (e.g.,
mathPrompts,vocabularyWords) and extend the page’s initialization logic to pull them in. - Localize by providing translations and switching which JSON file is fetched based on the user’s language.
- Keep special characters escaped properly (JSON requires quotes and backslashes to be escaped).
- Because HTML is embedded, validate the markup to avoid broken formatting.
This file may be small, but it’s the storytelling fuel that powers the daily learning routine.
vectors.html is a CAD-lite editor built on HTML Canvas. It lets you draw points, connect them into segments, detect faces, and even export the resulting geometry as an ASCII STL file for 3D printing or further modeling.
- Sketching – Left-click to place points, drag to create segments, and snap to existing vertices or guideline intersections. A selection rectangle (
#selectionRect) supports multi-select for moving groups. - Precision tools – The alignment overlay shows angles and lengths in real time. Holding modifier keys enables axis locking or midpoint snapping, making orthogonal or symmetrical designs easy.
- Face detection – When closed loops are formed, the app identifies polygonal faces, fills them, and lists them for extrusion/export.
- Project persistence – Buttons save/load JSON snapshots of all points and segments, so you can resume editing later.
- STL export –
exportSTL()triangulates detected faces and bundles them into an ASCII STL string that downloads instantly—perfect for quickly prototyping laser-cut or printed parts. - Help system – A built-in modal enumerates every shortcut and gesture so users can onboard themselves.
- Sketch a simple house (rectangle + triangle roof) and export to STL to see how 2D faces become 3D shells.
- Use the alignment status readout to create vectors at exact 45° increments.
- Practice selecting multiple points with the marquee, then press Delete to remove them as a group.
- Geometry is stored in arrays of point and edge objects; computations like face detection iterate over these structures. The deterministic order keeps exports consistent.
- Canvas rendering is layered: grid background, segments, points, selection overlay, and UI elements are drawn sequentially each frame.
- Export uses a simple fan triangulation; for concave polygons consider switching to ear clipping.
This application bridges art and engineering: draw freely, but with enough precision to manufacture what you sketch.
yourstories.de is a one-page marketing site for a storytelling service. It shares DNA with geschichte.html but is tailored as an external landing page with bold hero sections, feature highlights, pricing, testimonials, and a closing call-to-action.
- Navbar – Minimal top bar with “Preise” and “Jetzt starten” buttons that scroll to sections using anchor links.
- Hero – Full-screen background pattern, giant headline, and dual call-to-action buttons. Content centers around Christian Hohlfeld’s storytelling craft and AI voice synthesis.
- Feature grid – Cards introduce benefits like premium AI voices, personal Betreuung, and flexible Abos.
- Pricing section – Three packages (Einzelkauf, Monatsabo, Autoren-Paket) with checkmarks and animated hover scale.
- Testimonials – Carousel-like list of satisfied clients with avatars and quotes.
- CTA section – Encourages immediate sign-up with another button set and supportive copy.
- Footer – Contact details and legal links for a professional finish.
- Tailwind + DaisyUI deliver responsive design without manual CSS heavy lifting.
- Typography uses the Inter font family to keep everything crisp and modern.
- Utility classes power subtle animations (hover scaling, box shadows) to guide the eye.
- Hook the CTA buttons to your CRM or scheduling app by changing the
hrefattributes. - Add analytics by inserting a
<script>tag near the end; the layout already includes clear conversion points. - Translate the text to other languages or adjust the theme colors by modifying the
data-themeattribute on<html>.
This page is a polished storytelling sales pitch: it frames the problem, showcases the solution, and invites the reader to act.