jannis.wtf and jannis.lol are the same site: a page with no purpose beyond existing well. Every visit picks a visualizer and an input, either at random or by explicit choice using the controls on the main page. None of the inputs below are ever shown as literal numbers on that page. The point is to notice that a real input changed something, not to read a value off it.
Visualizers
plotter: A single pen that never lifts. Each frame computes one new point offset from wherever the pen currently is, then draws a straight line (or, in grid mode, a smoothed curve through the last three points) from the old point to the new one. There's no way to erase; given enough time, the walk saturates its bounds and the screen goes solid. The pen also swaps between three fixed ink colors on a random count of segments, unrelated to whatever input is selected.
automaton: A 1D elementary cellular automaton, in the tradition of Wolfram's Rule 30 and similar. Each new row is computed from the row directly above it: for every cell, look at itself and its two neighbors, and a fixed 8-entry rule table says whether the new cell turns on or off. That row draws along the bottom of the screen, and everything already on screen shifts up by one row's height, like paper feeding out of a printer. Which input is selected changes the rule number itself (chaotic, self-similar, or complex-looking rule families), not just what drives it.
terrain: A 2D noise field (value noise, two octaves, no external library) sampled at a slowly shifting coordinate offset each frame, so it reads as a fixed landscape with wind blowing over it rather than something regenerating from scratch. Each cell's noise value maps to a color through a five-stop palette; a second pass draws a thin line wherever two neighboring cells land in different color bands, for the engraved-contour-map look. A cell only repaints once its value has drifted enough since it was last drawn, which is also why switching to this visualizer from another one leaves whatever was already on screen intact and lets it gradually erode instead of clearing instantly.
moire: Two grids of fine parallel lines, overlaid at a slight and changing angle relative to each other, at partial opacity. The interference bands that appear are pure geometry, an unavoidable consequence of two periodic patterns overlapping slightly out of step, the same effect that shows up in photographs of window screens or scanned halftone prints. What no physical version of this could ever hold is the angle's precision; there's no registration error, no paper stretch, just an exact floating-point number driving both grids every single frame.
weave: A grid of horizontal and vertical threads rendered as a real over-under weave: horizontal threads draw first, full width, then vertical threads draw in row-by-row segments, skipped on alternating cells in a checkerboard pattern so the horizontal thread shows through there instead, the same logic a physical loom enforces with actual thread tension and gravity. Thread color slowly drifts through hue over time; nothing here is static even when no source is actively changing anything.
Inputs
random: No external input at all, on purpose. Every step comes from nothing but the visualizer's own randomness, so this is the baseline every other input is a departure from.
grid frequency: The continental European power grid is kept extremely close to 50.000Hz by the coordinated output of every connected power plant; deviation of even a few hundredths of a Hz is unusual. The server polls a public frequency-monitoring API every 3 seconds and normalizes the reading against a 49.8 to 50.2Hz band. The number itself is never shown. Instead, how far the current reading sits from 50.000Hz decides how erratic the current visualizer's own behavior gets, whether that means how sharply a line can turn, how quickly a pattern decays into noise, or how strongly its colors contrast. Near-nominal frequency, which is true most of the time, means calm; real deviation means agitated.
earthquakes: The server checks the USGS earthquake feed for magnitude 4.5+ events every 60 seconds. That feed always lists every matching quake from the past 24 hours, but a visible effect only fires when a quake shows up that wasn't there on the previous check. It reacts to a quake being freshly reported, not to a quake having happened at some point in the last day, which is true almost continuously anyway. Magnitude 4.5+ quakes happen globally roughly 1 to 2 times per hour, so left open, this mode triggers about that often.
github pulse: GitHub's public events API always returns just the ~30 most recent public events (pushes, PRs, issues, stars) across all of GitHub, checked roughly every 70 seconds, just under that API's own unauthenticated rate limit. Since the count returned is always about 30 regardless of true global volume, absolute counts are meaningless. What the server measures instead is how much real time those 30 events span: a fraction of a second during a busy moment, several seconds during a quiet one, and uses that as a live read on how busy GitHub is right now. This doesn't change any visualizer's shape, only its pace. More events per second means the drawing advances faster; a quiet stretch slows it down.
iss position: Polls a public feed of the International Space Station's current latitude/longitude every 5 seconds. The ISS completes a full orbit roughly every 92 minutes, so its longitude cycles through all 360 degrees repeatedly over the course of a day. That longitude is never shown as coordinates; instead it's treated as a slowly rotating compass bearing that biases which direction the current visualizer leans or turns toward.
wikipedia edits: Holds a standing connection to Wikimedia's public Server-Sent-Events stream of every edit across every Wikimedia site (all language Wikipedias, Commons, Wikidata, and more), as it happens. Edits average somewhere around 30-40 per second globally, but that varies with the time of day and whatever's in the news. Unlike the GitHub pulse source, which only ever changes pace, this one adds detail and density instead: more concurrent marks, finer texture, denser weave, depending on the visualizer, so a busier moment reads as more complex rather than simply faster.
shark tracker: OCEARCH tags sharks (mostly great whites, plus some hammerheads and others) with satellite trackers that report a location only when the shark's fin breaks the surface, which is inherently rare and irregular. The server checks all ~470 tracked animals every 5 minutes for whichever one pinged most recently; a visible effect only fires when that timestamp is newer than the last check, so this reacts to an actual real shark having just surfaced somewhere in the ocean. Unlike the earthquake source, which disrupts the existing pattern, a shark ping sends an independent traveling visitor through the scene that leaves its own trace and moves on.
human input: Directly reads your device's pointer position (mouse or touch) every time it moves, or the instant you first press or tap. Nothing is sent anywhere; this runs entirely client-side, no server involved at all. Each visualizer interprets it differently: plotter's pen pulls hard toward wherever you are, automaton keeps the column under you alive every frame, terrain raises a hill under your cursor.
This site pulls live public data to drive its generative visuals. None of it is ever shown as raw numbers, only as shape.
Earthquake data: courtesy of the U.S. Geological Survey (USGS), public domain.
Grid frequency data: netzfrequenz.info.
Activity data: provided by GitHub (public events API).
Source: forge.jannis.wtf/fej/jannislolwtf, WTFPL licensed.
Media owner: Jannis Federmair, Wels, Austria.
This is a private, non-commercial personal project: generative art driven by public data. No advertising, no products or services sold, no business object.
Controller: Jannis Federmair, Wels, Austria. Contact: spam@jannis.wtf
No cookies. No user accounts. No analytics or third-party tracking of any kind.
The web server automatically logs IP address, timestamp, and requested URL for every visit, as standard practice for operating a website reliably and securely (e.g. detecting abuse). Legal basis: Art. 6(1)(f) GDPR (legitimate interest in secure operation). These logs are rotated daily and kept for 14 days.
You have the right to lodge a complaint with the Austrian data protection authority (Datenschutzbehörde, dsb.gv.at).
← back