Spatial water chemistry
O₂, CO₂, nitrogen compounds, algae, bacteria, and detritus are represented on an 18 × 10 chemistry grid. Continuous sandbox glass can block diffusion between neighboring chemistry zones, allowing separate water compartments to develop different chemistry. Very small enclosures inside one chemistry cell will not be chemically independent. Surface gas exchange and depth-dependent light remain simplified processes.
Tank Focus quotationsQuotations appear for about 8 seconds with a 20-second gap. Additional selections and author attributions follow
Bucket List Journey’s nature quote collection.
Plants, growth & bubblesThe Plant removal tool harvests whole plants without adding detritus. Undo restores harvested plants while preserving current chemistry and growth of remaining plants. Plant biomass affects photosynthesis and respiration. Plants now change biomass gradually with modeled light and nutrient availability. Grass and ribbon forms can spread clonally when resources and space permit. Growth and spread rates are instructional parameters rather than calibrated species-specific rates. Visible bubbles remain qualitative indicators of active photosynthesis.
Plant rooting, cavities & substrate
Plant roots remain associated with the open-water cavity in which they were placed. A plant clicked beneath an overhang therefore roots on the lower substrate instead of relocating to the upper landscape. Sand, gravel, rock crevices, and the tank floor can support roots; bare glass cannot. Cave height can physically limit plant height.
Habitat shade & local light
Local photosynthetic light combines day/night cycle, the Light control, turbidity, water depth, and simplified habitat occlusion. Rock, sand, and gravel block direct light; glass transmits most light. Side openings provide partial indirect illumination, so shallow overhangs are shaded rather than automatically black. Deep enclosed caves can become very dim. This is a teaching approximation of light geometry, not optical ray tracing.
Substrate & oxygen
Sand, gravel, rock, and glass are not oxygen consumers by themselves. Their oxygen effect is indirect: they can shade producers, support rooted plants, create refuge, and trap sinking detritus. Organic matter trapped at substrate surfaces supports bacterial decomposition and nitrification, which can create localized oxygen demand. Anaerobic porewater inside deep sediment is not modeled.
Oxygen recovery
Photosynthesis, respiration, decomposition, nitrification, and gas exchange all contribute to dissolved oxygen. A die-off can depress O₂ for days while detritus is decomposed, but a well-lit producer-rich tank can recover as that organic load is consumed. Barrier-aware diffusion represents mixing between neighboring water zones; direct atmospheric exchange occurs only at the modeled water surface. Photosynthesis is also limited when dissolved CO₂ becomes scarce.
Animal behavior
Animals respond to food, predators, oxygen, habitat structure, depth, and boundaries using simplified steering rules. Minnows can select sheltered cruise targets and navigate into sufficiently wide cave-like spaces; solid structure still limits passage. Fish cruising, cave exploration, and schooling are behavioral approximations, not tracking data from a particular minnow species.
Predator-prey refuge
Vegetation, rock piles, and gravel create a modeled refuge score. Daphnia and scuds may move toward cover when fish are nearby, and prey in stronger cover are harder for minnows to capture.
Population dynamics
Energy, age, food, crowding, maturity, and stochastic reproduction influence populations. Lifespans and rate constants are tuned for instructional stability and are not experimentally calibrated predictions of exact real-world timing.
Scuds
Scuds are modeled as lower-water-column amphipod grazers/shredders that use detritus, algae/periphyton, and small amounts of soft plant tissue. Minnows can prey on them.
Modeled food & energy pathways
Every animal has an explicit food/energy pathway in the model. Daphnia graze suspended algae; snails graze algae/periphyton and detritus; scuds use detritus, algae, and limited soft plant tissue; minnows consume Daphnia and scuds and also graze algae and detritus. Bacteria process detritus and carcasses. Producers require light, inorganic nitrogen, and CO₂. These pathways are intentionally visible enough for students to infer a food web from observations rather than being presented as a complete real-community web.
Bacterial persistence
Existing bacteria grow through modeled decomposition and nitrification. Maintenance loss is proportional to biomass, so small populations can persist and respond when resources return. No minimum bacterial population is imposed. The single bacterial pool combines multiple microbial functions and uses instructional rate constants.
Oxygen budget & water chemistry condition
The optional oxygen budget accounts for the last simulated step, including photosynthesis, respiration, decomposition, nitrification, surface exchange, mixing, and numerical bounds. Water chemistry condition is an instructional 0–100 score based on selected chemistry, pH, and temperature. It does not measure population persistence, biodiversity, or future ecosystem stability.
Systems check 3.14.1
Chemical diffusion conserves dissolved material between equal-volume zones. Plant chemistry, added food patches, consumer resources, and spawning use the connected glass compartment. Fish cannot consume the same prey twice. Photosynthesis requires available CO₂; algae require an existing population. These are consistency checks of an educational model, not calibration against field data.
Glass compartments
Continuous glass blocks animal movement and chemistry diffusion. Only water compartments connected to the modeled surface receive direct atmospheric gas exchange. A fully submerged sealed compartment can therefore develop its own O₂, CO₂, and nitrogen chemistry. Animals search for food, predators, and higher-O₂ water only within their connected compartment.
Carcasses & decomposition
A dead minnow sinks until it contacts the actual modeled floor, sand, gravel, rock, or glass structure beneath it. Decomposition promotes local bacterial biomass, contributes detritus and ammonia, consumes dissolved oxygen, and releases carbon dioxide. Multiple carcasses have additive local effects. The model now includes a simplified high-CO₂ stress response, but its threshold is instructional rather than species-specific.
Conservation of matter (3.18)
Carbon, nitrogen and phosphorus are tracked through dissolved pools, algae, plants, animals, carcasses, detritus, bacteria and sediment. Every process moves atoms between pools; only CO₂ exchange with the air, runoff and your own actions add or remove them. Open Mass balance to see the totals. Oxygen is linked to carbon: photosynthesis releases, and respiration and decomposition use, one O₂ for each CO₂ (quotient 1). Nitrification uses 3.43 mg O₂ per mg N oxidized to nitrite and 1.14 to nitrate.
Light, nutrients & producers
Photosynthesis follows a Steele light curve: it rises with light, peaks near the optimum, and declines in very bright light (photoinhibition). Algae shade the water below them (Lambert–Beer), so blooms darken deeper water. Growth is limited by the scarcer of nitrogen and phosphorus (Monod kinetics with Liebig’s law of the minimum); the default tank is phosphorus-limited, as many fresh waters are. Growth rises about twofold per 10 °C (Q10).
Sediment phosphorus
Oxic sediment binds phosphate (iron-bound P); when bottom water loses oxygen, the sediment releases it. This internal loading can amplify eutrophication: a bloom decomposes, bottom water becomes hypoxic, phosphate is released, and the next bloom is fed. The model does not include denitrification or burial.
Ammonia toxicity
Total ammonia (NH₃ + NH₄⁺) is shown as Ammonia-N. Only the un-ionized NH₃ fraction is toxic; it is computed from pH and temperature (Emerson et al. 1975). At pH 7.2 and 22 °C about 0.7% is NH₃; at pH 8.6 and 28 °C it is about 22%. Animal stress begins near 0.02 mg/L NH₃-N.
Food webs & reproduction
Minnows capture prey following a Holling type II functional response (intake = aN / (1 + ahN)), so feeding saturates when prey are plentiful. A few prey per compartment are protected in refuges. Minnows also graze algae and detritus. Grazers feed at a rate that saturates with food concentration. Eaten food is egested (30%), stored as body reserves, or respired. Offspring are built from stored reserves, so births depend on food; juveniles grow from reserves before they reach adult size. Hungry prey accept more predation risk to keep feeding. Starvation is a rising risk in poor condition rather than a sudden threshold, and minnows have a small background mortality.
Plant dynamics
Macrophytes photosynthesize by day, respire continuously, and shed about 1% of their tissue per day as detritus. They take N and P from the root zone. Shade, turbidity or heat above 30 °C can push a plant below its die-back threshold; after 4 days there it dies and all its tissue becomes detritus that bacteria must decompose. Healthy plants spread by runners (grass, ribbon) or rooting fragments (stem plants), with the daughter’s tissue coming from the parent.
Cycle view (3.19)
The 🔄 Cycle view draws every recorded transfer of carbon, nitrogen or phosphorus between pools while the model runs. Arrow width follows the flow rate and circle size the amount stored (log scale, because the dissolved pools are much larger). “Right now” averages roughly the last hour, so it shows day/night changes; “24-hour average” smooths them. The flows add up exactly to each pool’s change, so the picture is a complete account of where matter went.
Organic soil (3.35)
The ▤ Soil brush lays nutrient-rich organic soil (like pond mud or aquarium soil) on the bottom; chambers can have none, thin or deep soil. Each soil cell holds organic matter that bacteria decompose at about 1.2% a day at 20 °C (Q10 = 2; about a third as fast without oxygen). Decay takes O₂ from the water just above the soil and returns CO₂ there; its ammonium and phosphate go into the soil's porewater. Rooted plants feel the porewater's high concentration (nutrients in a small pore volume) and take from it first, so plants rooted in soil grow faster. Porewater not used by roots seeps into the water at about 7% a day, where algae can use it. Sand, gravel and rock remain chemically inert: they lift plants toward the light, shade, give scuds refuge and trap sinking detritus. Not modeled: soil layers that go fully anoxic at depth, denitrification, and methane.
Experimental chambers & grow lamp (3.34)
🧫 Experimental chambers (Quick-start list or View & data) divide the tank into 2, 3, 5, 6 or 9 equal glass chambers; with 5 the last 3 litres stay an open water bath. Each chamber can have a glass lid (no gas exchange), shade cloth (0% = a dark bottle), extra nutrients (+1 mg/L nitrate-N and +0.03 mg/L phosphate-P per dose) or CO₂ (+4 mg/L per dose), and its own algae (none, or a standard culture of 0.5 units at ½×, 1× or 2×), plants and Daphnia. Natural variation gives each chamber a slightly different starting algae so replicates differ. Chambers start with freshly mixed water (the tank's average chemistry and bacteria in every zone). A magnetic stirrer option keeps a chamber mixed; without it, settling detritus and the busier bacteria near the bottom slowly build a top-to-bottom oxygen gradient. Temperature is shared, because the chambers sit in one water bath. A grow lamp can replace the sun: always on, or on a 16 h or 12 h timer; at 100% it equals the midday sun. Under a grow lamp the background becomes a still lab wall, with no moving sun or moon. The results table reports gross photosynthesis from the model's oxygen ledger, the net O₂ change a probe would see, and the light-and-dark bottle estimate.
Simulake (3.60)
EcoSphere Lab is now called Simulake. Saved tanks, autosaves, Graph Studio graphs and other settings from earlier versions still load. Downloaded files now start with "simulake-". Every visit opens with Strike Effects on Gentle; Full or Off can still be chosen and lasts until the page is closed. Tanks made in the sandbox (the opening tank, Reset, Clear and the investigation presets) now start with Oxygen realism set to Realistic: animals breathe at real-sized rates and dead fish use real amounts of oxygen as they decay. Gentle and Strict are still in the menu, and the game modes keep their own settings. Tested: the starter tank at Realistic for 90 days (3 seeds) keeps every species, with dissolved O₂ about 6.3–7.3 mg/L (8.4–8.9 at Gentle) and pH about 7.4.
x uncertainty for every point (3.59.5)
Each x–y series has a "± x for every point" box: a fixed amount in x units (e.g. ± 0.5 mL from a syringe, ± 1 °C from a thermometer) or a percentage of each x value (e.g. ± 2% for solutions made by dilution, where the absolute uncertainty grows with the concentration). It draws horizontal error bars on every point; a number typed in a row's own ± x cell replaces it for that row. In Compare groups with amounts, the same setting draws a horizontal error bar on each group's mean. The CSV export lists the x uncertainty used for each point. Curve fits and max/min slope lines use the y values and y error bars only.
Values on bars (3.59.4)
Graph Studio can write each mean on the graph: on top of the bar (above its error bar and dots, with any letters above that) or inside the bar near its base (in white or black, whichever reads better on the bar colour; a bar too short or narrow for its number gets it on top instead). For means-with-error-bars and dot plots the choices are above the error bar or beside the mean. Decimal places are "auto" (one more than the raw data, the usual convention for a mean) or 0–3, and the ± SD, SE or 95% CI can be added after each mean. Works in Compare groups and in x–y bar charts.
Compare-groups examples (3.59.3)
The Load an example menu in Graph Studio is split into 📈 Graph x–y data and 📊 Compare groups. The five group examples use made-up but realistic numbers, and each leads to a different analysis when the test is left on "choose for me": stomatal density on the upper and lower surfaces of Helianthus annuus leaves (two groups → Welch's t-test, shown as a bracket); fertiliser on bean growth (normal, equal spreads → one-way ANOVA with Tukey letters); mayfly nymphs above, at and below a farm drain (skewed counts fail the normality check → Kruskal–Wallis with Dunn's tests, box plot); Daphnia magna heart rate in caffeine and ethanol (unequal spreads → Welch's ANOVA with Games–Howell, dot plot); salt on duckweed (Lemna minor) at five concentrations (amounts → trend line fitted to all 30 pots). The test choices were checked against SciPy (Shapiro–Wilk on residuals, Levene with medians). With two groups, Statistics & report can now draw the result as a bracket on the graph.
Removing series and groups (3.59.2)
In Graph Studio, every series chip has a × that removes that series and its data (shown when there are two or more), and the series settings have a labelled 🗑 Remove button. In Compare groups, a × beside each group name removes that group, its values and its amount. Both show an ↶ Undo button for 8 seconds. The comparison and correlation settings follow the remaining series.
Mean markers (3.59.1)
In Compare groups, "means with error bars" now shows each mean as a dot only. The short horizontal line through the dot was a mean marker, not an error bar, but it looked like an x-axis error bar, especially on the number line used for amounts. The dot plot keeps its line, because there the dots are single values and the line marks the mean. Group error bars are vertical only (spread of the response); x uncertainty can be entered in Graph x–y data (the ± x column).
Graph Studio trends and text formatting (3.59)
In 📊 Compare groups, tick "The groups are amounts of one variable" when the groups are doses, concentrations or temperatures. Each group gets an amount (taken from the first number in its name, "control" = 0, or typed in); the groups are placed on a number line and a trend is fitted by regression to every replicate value, not to the group means (fitting to the means throws away the scatter between replicates and inflates R²). Statistics & report adds a trend section: equation, slope ± SE with its 95% CI, R², F or t with degrees of freedom, p, Spearman's ρ, and a lack-of-fit test (does the model miss the group means by more than the replicate scatter explains?). When the ANOVA and the trend test disagree, the page explains that they answer different questions, and the student chooses which one is the main test for the conclusion. Tested on a 5-dose, 8-replicate data set: slope, SE, R² and p match SciPy's linregress; the lack-of-fit F matches the textbook formula. All graph text (title, subtitle, axis labels, caption, legend, group and category names) can use *italic*, **bold** and __underline__, with I / B / U buttons and Ctrl+I, Ctrl+B, Ctrl+U, for Latin names such as Daphnia magna. A font menu offers Arial, Calibri, Times New Roman, Georgia, Verdana and Courier New. The standalone Graph Studio (1.1) is built from the same code.
Graph Studio statistics (3.58)
Data layout → groups side by side takes data the way most ANOVA calculators do: one column per group with its name at the top, one value per replicate. Paste a whole block (with or without the header row), or use 📐 Calculate values from repeated measurements to turn rows of measurements (e.g. plant heights on several dates) into % change, total change, rate per day, final value or mean. Graphs: bar chart with error bars and optional dots, box-and-whisker plot (median, IQR, 1.5 × IQR whiskers, outliers, mean +), dot plot, or means with error bars. Statistics & report: descriptive table (n, mean, SD, SE, 95% CI, median, range, outliers, Shapiro–Wilk per group); assumption checks (Shapiro–Wilk on residuals; Levene's test, Brown–Forsythe version); the test chosen from those checks or by hand (one-way ANOVA with SS/df/MS/F table, η², ω², Cohen's f; Welch's ANOVA; Kruskal–Wallis with ε²; for two groups Welch's or Student's t-test with Cohen's d, or Mann–Whitney U); post-hoc comparisons (Tukey HSD / Tukey–Kramer, Games–Howell, or Dunn's test with Holm adjustment) with differences, 95% CIs, adjusted p and Cohen's d, and letters on the graph. A write-up in APA style covers descriptive results, the test, effect size, post-hoc results, assumptions, outliers and the conclusion, with a note on power when a large effect is not significant. It can be copied or saved as an HTML report. Arrow keys and Enter move between table cells. Checked against SciPy on a 5-group × 8 data set: identical F, p, η², Levene, Shapiro–Wilk (groups and residuals), Kruskal–Wallis, Mann–Whitney and Tukey p-values and confidence intervals (to 4–5 decimals).
Graph Studio (3.57)
📈 Graph Studio (top bar) graphs students' own data. Enter values with ± errors, or raw trials that are averaged for you (mean, SD, SE, 95% CI; error bars as SD, SE, 95% CI or range). Paste a block straight from Excel, Google Sheets or Logger Pro. It offers horizontal (x) uncertainty bars, several series and a second y axis. Curve fits: linear, through the origin, quadratic, cubic, exponential, logarithmic, power, saturation (Michaelis–Menten) and logistic. Each fit shows its equation, R², parameter ± SE and 95% CI, an optional 95% confidence band and weighting by 1/error². Max/min slope lines through the first and last error bars give the slope uncertainty. Statistics: n, mean, SD, SE and CI per point; Pearson r and Spearman ρ with p; Welch's t-test; one-way ANOVA (p from the exact t and F distributions); a significance bracket on bar charts. Style: title, subtitle, axis labels with a symbol bar (± ° µ ² ⁻¹ ₂ Δ), figure caption, axis ranges, steps and log scales, colours (incl. colour-blind safe and greyscale), markers, lines, legend position, text size and graph shape. Export: PNG at 2×, 3× or 4× (300 dpi print), SVG, copy as image, and a CSV of the data and fit. Graphs can be saved as a file and opened again, and the last graph is remembered on this computer. The trend graph in the lab can be saved as PNG or SVG, or opened in Graph Studio.
Replicate graphs (3.56.2)
🧪 Pools (guppies) and 🧪 Lakes (sticklebacks) can now save their graph as a PNG picture or an editable SVG: one thin line per pool or lake, the mean in bold, the starting value dashed, and the end-of-run mean, range and spread printed under the graph with the settings used. The guppy graph shows whichever trait is chosen in the Graph menu.
Stickleback Armour (3.56)
A new evolution experiment (🎮 Modes → Evolution → 🛡 Sticklebacks) about one gene with two alleles. In threespine sticklebacks, the Eda gene controls most of the difference between fully plated fish (CC, about 33 plates a side) and low-plated fish (LL, about 6); CL fish are mostly partial (C is partly dominant). Sticklebacks breed once a year, so generations are separate: adults pair (at random, or with their own plate morph), the young are produced, survival to breeding depends on plates, the lake keeps a random sample of survivors up to its size (drift), and sea-run migrants (L ≈ 1%) can join. Selection: trout and diving birds × (0.78 + 0.22 × plates/33); insect predators × (1 − 0.35 × plates/33); soft water × (1 − 0.2 × plates/33). The 🧮 Hardy–Weinberg view shows the working: allele counting, expected p²N, 2pqN, q²N, (O − E)²/E and χ² against 3.84, on a random sample of up to 200 netted fish (counting every fish in a large lake would catch whole families of siblings and inflate χ²). A checklist shows which Hardy–Weinberg conditions hold. 🧪 Lakes runs replicate lakes. Six ready-made experiments: Hardy–Weinberg check, Loberg Lake, mate with your own kind, trout lake, drift in tiny lakes, and sea-run migrants.
Tested (6 runs each, 1000 fish): all forces off, q stays near 0.5 and the χ² test fails in 6% of years (5% expected by chance); Loberg Lake (q 0.2 → insects + soft water): low-plated fish 17–28% at year 5, 61–72% at year 11 (the real lake: 75%), about 88% at year 20; trout from q 0.5: q falls to about 0.2 in 20 years; mating with your own morph: q stays near 0.5 but every year fails the χ² test (too few CL); in the Loberg settings, sea-run migrants at 10% a year hold q near 0.65 instead of letting it reach 1 (migration–selection balance), and adult samples then often fail the χ² test because migrants are mostly CC; 50-fish lakes: L was lost or fixed in 4 of 6 within 100 years.
Guppy genes (3.55)
Inheritance is now Mendelian. Male colour, size at maturity, offspring size and shoaling are each set by 5 genes. Every fish carries two copies of each gene, one from each parent, and passes on one copy of each gene at random. Before 3.55 a young fish simply got its parents' average ("blending"), which halves the variation every generation, so the mutation setting had to keep evolution going. That option is still there (Genes → Inheritance → blending) so students can compare the two. Each trait also has a small non-inherited part, so at the start about half of the variation is genetic (shown in 📊 Variation). Because variation is now kept, far fewer mutations are needed: the default mutation rate is 1 in 20 offspring (there is also 1 in 200).
New traits. Offspring size: bigger young mean fewer of them (brood ∝ size³ / offspring size1.6), but bigger young grow out of Rivulus's reach sooner and cope better with crowding. Crowding now counts body mass rather than heads. Shoaling: cuts a pike cichlid's success by up to 70% but costs up to 15% of feeding. Female choosiness (Mating → inherited): choosy females are exposed while inspecting males (cichlid risk × (1 + 0.8 × choosiness)).
New settings. Colour genes on the Y chromosome (father to son, as for many real guppy colour genes); canopy shade (less food, and fewer carotenoids, so expressed colour × 0.7: Grether); migrants from a pike-cichlid or a Rivulus stream (gene flow); 1 in 200 mutation rate.
Re-tuned. With real genetic variation, the old preference and predation strengths made changes far too fast. Female preference is now exp(choosiness × (3 × colour + 1.5 × (size − 1))) (was 6 × colour), and pike-cichlid colour selection is e^(12 × (colour − mean)) (was 22). Bright males also pay a condition cost when food is short.
Tested (8 runs each, 200 days ≈ 40 generations, starting at 35% colour; means, with ranges): pike cichlid: colour 8% (1–20%), size at maturity 0.94, offspring size 0.98, shoaling 71%. No predator: 73% (53–95%), 1.06, 1.15, 35%. Rivulus: 66% (43–95%), 1.07, 1.21, 26%. These match the direction of the Trinidad field differences (Endler, Reznick, Magurran). When choosiness evolves it ends lowest with the cichlid (0.91, vs 1.05 with no predator and 0.99 with Rivulus; start 1.0): a small but consistent difference. Blending with the cichlid: 22–38% colour (Mendelian genes: 1–20%), because blending runs out of variation. Bright pool + cichlid + strong choice: 13–59%. Colour genes on the Y: 12–26%. Shaded pools: males look duller at once; over many generations their colour genes rise to make up for it, as Grether found in shaded Trinidad streams ("countergradient variation").
Food web: minnow offspring now get their parents' average plus a random Mendelian segregation part (the infinitesimal model), so minnow variation is kept. Daphnia reproduce by cloning, so they are unchanged.
Evolution workspace and genetic drift (3.54)
Both evolution modes now open their panel in the right-hand column, with Pause, 🔁 Restart (click twice), ⚙ Setup and 📌 Mark always at the top. Guppy Evolution adds: a pool size setting (food for about 25, 80 or 300 guppies); 6 founders as a starting population (the founder effect); a predator that arrives later (after 20 or 40 days); a 🌊 flash flood that sweeps away 9 in 10 fish at random (a bottleneck); a tail-spot gene that no predator or female notices (one gene, alleles S and s, S dominant, Mendelian inheritance), whose allele frequency changes only by drift and acts as a control; 🧪 Pools, which runs 5–20 replicate pools with the same settings in seconds and shows how far chance spreads them; a Variation view (histograms and tail-spot genotypes); and four ready-made experiments (Endler's greenhouse pools, the upstream transplant, drift in tiny pools, predators returning). Selection rules are unchanged from 3.53. Tested (20 pools each, 100 days ≈ 18 generations, no predator, female choice off): in small pools (food for ≈25) the tail-spot allele was lost or fixed in 8 of 20 and ended anywhere from 0% to 100%; in medium pools it ended between 5% and 88%; in large pools (≈300) between 25% and 68%, with none lost. With a pike cichlid, large pools all fell to about 8% male colour, while 8 of 20 small pools died out.
Guppy size fix (3.53)
Pike cichlids now eat guppies of every size, large ones most (risk ∝ 0.25 + 0.75 × size³). Before, fish smaller than 0.55 could not be eaten at all, so a run with large mutations could evolve tiny adults (size at maturity 0.6) that escaped predation, and strong female choice then drove male colour back up under cichlids, which real guppies do not do. Juveniles also grow more slowly (they take longer to mature), so high adult mortality now favours earlier, smaller maturity the way it does in Trinidad streams. Tested (6 runs each, about 2000 h): pike cichlid from 35% colour → 5–15%, size at maturity ~0.95; from 60% → 25–40%; no predator → 44–61%, size ~1.03; Rivulus → 47–70%, size ~1.06; bright pool switched to cichlids → colour falls with normal or strong female choice. The long sequence cichlid → none → strong choice + ±15% mutations → cichlid ends at 5–13% colour and size ~0.94 (it ended at 77–86% and 0.65 before). Runs take about 15% fewer generations per day than before.
The guppy pool (3.52)
Guppy Evolution now opens in a Trinidad hill-stream pool: a sandy, gravelly bed that deepens toward the middle, a shallow riffle edge, river cobbles, a boulder pile and an undercut bank with tree roots, leaf litter, sun flecks and ten plants of three kinds. The scenery is decorative: predation, female choice and growth follow the same rules as before, and "many plants" (the only habitat setting that changes predation) adds a dense stand of eight plants across the middle. Guppies and their predators stay above the stream bed.
Strike lunge (3.51)
Hunting fish now strike the way real predators do: they fix on the prey, draw back with the body flexed and the tail cocked (an "S-start"), then dart forward with fast tail beats; the prey is taken at contact, and only then do the strike effects play. A bass's strike against a minnow takes about half a second; a minnow snapping up a Daphnia about a quarter of a second. The model still decides each catch exactly as before; only the drawing is timed, so results and tournament codes are unchanged. "Reduce motion" in your computer's settings shortens the wind-up.
Real water chemistry (3.50)
pH is live. The water holds carbon as free CO₂ and as bicarbonate; with the alkalinity (about 0.86 meq/L, soft water) this sets the pH of every zone. Photosynthesis takes CO₂ and pH rises; respiration and decay add CO₂ and pH falls; nitrification makes acid (2 H⁺ per ammonium); algae and plants can use bicarbonate when CO₂ runs low. Free CO₂ moves toward the air's level (about 0.68 mg/L at 22 °C), so fresh tap water loses CO₂ and its pH rises toward 8. The pH slider now shows the live pH; dragging it adds acid or base. Toxic NH₃ follows the live pH. Photosynthesis at real rates. Organic matter now has Redfield carbon (C:N:P = 106:16:1), so each unit of algae growth makes about 3.3× more O₂ than before, and algae are no longer capped at a low density (self-shading and nutrients limit them). Plants photosynthesise and respire at the rate of real submerged plants (about 2 mg O₂ per hour for a full-grown model plant in good light); their extra tissue is shed and decays over about 10 days, so over weeks it balances. Typical chamber results: lab water light bottle +0.2 mg O₂/L/day net (gross 0.6); pond water +0.8 (gross 1.4); 4 plants on soil push O₂ to 17 mg/L and pH to 9.7 in 3 days. Ammonia. On Realistic and Strict, real-sized animals also excrete ammonia (0.1 mol N per mol O₂). Mixing. Gentle now mixes the water like Realistic (real tanks turn over within hours) and surface gas exchange is about 0.3 m/day (still water), so O₂ and CO₂ settle toward the air within days. Crowding costs less energy (it starved crowded fish in a day and a half); death notices give the cause.
Respiration releases CO₂ at real size (3.49)
With oxygen realism Realistic or Strict, animals breathe at real-sized rates (a 2 g minnow uses about 0.5 mg O₂ per hour at 20 °C) and now also breathe out CO₂: 0.85 mol CO₂ per mol O₂ (about 1.17 mg CO₂ per mg O₂). Real-sized carcass decay releases 1 mol CO₂ per mol O₂. Example: 11 minnows in a sealed 27-litre chamber use about 0.24 mg O₂/L and add about 0.28 mg CO₂/L every hour, so CO₂ climbs from the first hour while O₂ falls. Before 3.49 this extra breathing used O₂ but released no CO₂. In Gentle mode animals breathe at the small model scale, so fish change CO₂ very little. The model tracks only dissolved CO₂ and keeps pH fixed; in real water the same CO₂ would also lower the pH.
Chamber additions (3.48)
Organisms, plants, algae, bacteria, detritus and habitat (rock, gravel, soil, sand, glass) added to a chamber with the tank tools are logged with the time. Added before measuring starts (before the first Run, or before "Start measuring now"): they become part of that chamber's treatment, shown as "added: …" in the graph key, the results table and the CSV, and chambers count as replicates only if their additions match. Added after measuring starts: a numbered ⚑ flag and dotted line on the graph at that time, a note in the table, and a "changed_since_last_reading" column in the CSV. Disturbances (runoff, heat wave…) are flagged for the whole tank.
Guppy predation (3.47)
A pike cichlid hunts by sight and takes the adult males that stand out most from the other males (risk × e^(22 × (colour − average male colour)); colour shows only at maturity), plus larger fish in general. Because the average sets the baseline, the cichlid keeps favouring duller males at any colour level without wiping out all males at once. This replaces the 3.46 cap, which stopped selecting once every male was bright. Tested: pike cichlid from 35% → under 10% in about 20 generations; from 60% → about 30%; a bright population switched to pike cichlids → colour falls (normal choice about 60% → 48%, strong choice 79% → 62% within 8 generations). Graphs now download as PNG pictures (SVG still available). Animals stay still while a game waits for ▶ Start, and graph markers no longer overlap.
Evolution setup and exports (3.45)
Both Evolution games open on a setup screen: choose predators, female choice (guppies), plants, water, light, mutation size and rate, the starting population and a run length (the run pauses at a chosen generation), then press ▶ Start. Results can be exported as a CSV time series, a CSV of every guppy alive (for histograms) and a graph image with markers for every change made during the run. "New run, same settings" makes replicates.
Smooth swimming (3.44)
The model moves animals once per model hour. The drawing now follows each animal with a smooth, real-time glide (a critically damped spring) instead of easing from one hourly position to the next, so animals no longer speed up and slow down every step. Only the drawing changed; the drawn position trails the model by about one step. Animation "Reduced" shows the raw hourly positions.
Guppy Evolution (3.43)
A second Evolution game, after Endler (1980) and Reznick & Endler (1982). Guppies carry two heritable traits: male colour (spots and tail colour; females carry but do not show it) and size at maturity. Pike cichlids eat large adults and find bright males more easily; Rivulus eats small juveniles; females prefer colourful, larger males; when crowded, small fish lose out for food; bigger mothers have more young. Offspring take their parents' average plus a random mutation. Mutation size is how big a change is; mutation rate is how many offspring carry one (both also in the food-web Evolution game). The guppies live in their own simplified model; the tank chemistry runs underneath. Typical runs (about 15–25 generations, starting at about 35% colour): no predator → male colour 55–65%; pike cichlid → 10–25% and smaller size at maturity; Rivulus → about 65% and size at maturity up 10–15%.
Chamber lab in real units (3.42)
Each chamber's starting nitrate, phosphate, ammonia and CO₂ are chosen as actual concentrations (mg/L), or left as lab water. Each chamber can stand in its own water bath (5–35 °C); temperature acts on every process in that chamber's water (photosynthesis, respiration, decomposition, nitrifier activity, animal metabolism and oxygen solubility). Photosynthesis now has an optimum: it rises with temperature (Q10 = 2) up to about 28 °C, then falls, while respiration keeps rising, so net oxygen production peaks at a middle temperature. Plants also respond to temperature (no change at the default 22 °C). Chambers can hold 0–40 Daphnia, 0–12 snails, 0–12 scuds, 0–4 plants and 1–3 fish. The chamber graph can add a second variable on a right-hand axis and a strip showing the light (or temperature) each chamber received.
Fish quests (3.41)
Be the Fish can be 3, 7 or 14 days long (disturbances scale to fit). Each game draws three quests suited to the fish (for example "crunch 6 snails", "catch 2 minnows within one day", "eat 3 prey in the dark", "visit all 6 parts of the tank"). Eating several prey within 4 seconds builds a combo, and a ⭐ golden prey appears now and then for bonus points. Best scores are kept per fish and length on this computer. The player is marked with a solid cyan ring and pointer, so it is not confused with the dashed yellow "hungry" health ring.
Be the Fish (3.40)
The playable mode now offers all five species. Each keeps its own size, speed, diet and oxygen tolerance: bluegill and redear spawn with a partner of their own kind; the catfish scavenges dead bodies and sees in the dark; the bass strikes at minnows with Space (prey that hide in plants or rocks often escape). In the minnow game a hungry bass can be added as a danger. Strike effects now default to Gentle; Full and Off are in the menu.
Tournament codes across versions (3.39.1)
Result codes now record the model version. When the teacher verifies codes made in an older version, each design is re-run in this version with the same tournament code and challenges, and the board ranks every team by that re-run score (marked ↻ re-scored), so all teams are compared in the same model. A code made in this version whose score does not match is flagged as probably edited.
Line of sight, strikes and resting fish (3.39)
A fish can only target prey it can reach in a straight line: rock, sand, gravel, soil or glass in between hides the prey (prey resting right on a surface can still be picked off it). When a fish catches prey it darts to it, so nothing is eaten from across the tank; fish eating fish shows a CHOMP! strike (Strike Effects button in the menu). Resting fish now hold station near cover instead of swimming back and forth across it, and a fish only turns around for a real change of direction.
Chamber graphs and health rings (3.38)
The 🧫 chamber results now include a graph: choose O₂, change in O₂, photosynthesis rate or total, CO₂, ammonia, nitrite, nitrate, phosphate, algae or plant biomass. Every chamber has its own colour, line pattern and letter, so lines can be told apart without colour vision. "Treatment means" averages replicate chambers and shades their range. "Save graph" makes an SVG image with a white background and a key. Readings are taken once per model hour; the CSV export has the same data. Health rings around animals: thin solid = healthy, dashed = hungry, thick dotted double ring = stressed. The Health Rings button (in the menu) cycles all / problems only / off.
Pond fish species (3.37)
Five fish from a typical North American pond: fathead minnow (the original model fish), bluegill, redear sunfish, channel catfish and largemouth bass. They differ in size (a bass is 2× a minnow's length and 3× its mass), diet, preferred depth, activity (catfish feed at night; bass wait in cover and ambush) and oxygen tolerance (catfish cope with low O₂, bass need the most). Bigger fish breathe more in total but less per gram. A predator can swallow a fish only if the prey's body depth fits its mouth (gape): deep-bodied sunfish are hard to swallow, catfish spines protect them, and the last three prey-sized fish in a compartment always find shelter. Minnows, bluegill and redear spawn in same-species pairs; bass and catfish are stocked and do not breed in the tank. Sizes and rates are scaled for the model: a real bass that eats bluegill is far larger than this tank allows. All fish obey the same carbon, nitrogen and phosphate mass balance.
Dead bodies & the nitrogen cycle (3.33)
Dead Daphnia, snails and scuds now sink as visible bodies and decay over about 5 days at 20 °C (faster when warm, slower with little oxygen or few bacteria). Before 3.33 their tissue became detritus instantly where they died. Decay releases ammonium (yellow specks), CO₂ and phosphate where the body lies, and part of the body becomes detritus and bacteria. The ⚗️ Chemistry panel shows each nitrogen transformation as it happens, from the model's own ledger: ammonification, nitrification step 1 (NH₄⁺ → NO₂⁻) and step 2 (NO₂⁻ → NO₃⁻), uptake of ammonium and nitrate, and excretion. Denitrification and nitrogen fixation are not modeled.
Oxygen realism (3.32)
The model's animals are small in biomass so that a tank's algae can feed the food web, which also means their food-based respiration uses far less oxygen than real animals (about 0.015 mg O₂ a day for a model minnow, against roughly 12 mg for a real 2 g minnow). Gentle keeps that forgiving scale. Realistic adds each animal's routine respiration at real rates for its size (minnow 0.5, snail 0.02, scud 0.006, Daphnia 0.0008 mg O₂ per hour at 20 °C, Q10 = 2), drawn from the water around it, and the real oxygen demand of a decaying fish (about 400 mg O₂ for a 2 g minnow). Water mixes within hours, as in a real tank. Strict is still, warm water: slower mixing, half the surface gas exchange and a quarter more demand. Pond snails at the surface film breathe air. The extra oxygen use is O₂ only; carbon, nitrogen and phosphorus stay exactly conserved. Tested: a minnow sealed in a 4-litre glass box suffocates in about 1½ days at Realistic and survives indefinitely at Gentle.
Glass walls (3.32)
The glass tool draws straight walls 2 terrain squares thick by default (snapping level or upright onto the 1-litre chemistry grid, because water chemistry is uniform within each litre; Shift for freehand). Animals that touch glass slide along it and, if their target is out of reach, detour around it; animals caught inside newly drawn glass are moved to the nearest open water.
Snails (3.30)
Pond snails crawl; they do not swim. Each snail is always on a surface (the bottom, a rock, a plant, the tank glass or a glass wall, or the underside of the surface film) and climbs only where there is something to climb. Snails make regular grazing trips up plants and the glass to scrape periphyton (the algae film on surfaces), and graze algae and detritus on the bottom. A snail that lets go sinks back down. In low oxygen they crawl to the surface to breathe air, because pond snails such as Physa and Lymnaea are pulmonates with a lung. Click a snail with Inspect to see what it is doing.
Day and night (3.27–3.29)
The sun is above the horizon exactly when the model has daylight (06:00–18:00), following the same half-sine the model uses for photosynthesis. The “light” figure in the day/night badge above the tank is the sunlight reaching the water surface after the Light slider and turbidity. Dawn and dusk colours appear in the hour or so either side of sunrise and sunset, when the model's light is zero or very low. The moon is decorative and does not light the model.
Cycle view investigations (3.26)
An Oxygen tab shows O₂ made by photosynthesis and used by respiration, decomposition and nitrification, plus exchange with the air; these add up exactly to the change in dissolved O₂. Predict hides the arrow sizes so students choose which flow a change will alter most, then compares the 24 h before with the 24 h after. Before / after does the same comparison for any change. Both use exact running totals of every flow, so the numbers are precise rather than smoothed. Tracer atom moves one atom between pools at random, with each pool's stay drawn from an exponential distribution whose mean is the amount stored ÷ the outflow, and exits chosen in proportion to the flows (a simple Markov model of real isotope-tracer studies). The Energy pyramid converts the 24-h carbon flows to energy at ≈39 J per mg C and computes production as assimilation (70% of food eaten) minus respiration. Clicking a circle opens its balance sheet: inflows, outflows, net change and turnover time. None of these tools change the model.
Parameter tableEvery tuned rate in the model, with units and the kind of evidence behind it. Values marked instructional are tuned for a stable classroom model rather than taken from one study. Run
node tests/sensitivity.js to see how each parameter affects persistence.
What the * preset means
The hidden * configuration is a reference ecosystem that has been stability-tested within this model. It is not a claim that those exact organism numbers form an optimal real ecosystem. Scuds remain intentionally absent from that preset.
Interpretation
Use the model to investigate mechanisms, patterns, feedbacks, and evidence. Treat exact numerical outcomes as outputs of this educational model rather than measured ecological forecasts.