Methodology

How the calculators work, where the numbers come from, and what they don't tell you. Last updated May 2026.

This page exists because every stocking calculator and fish profile on the internet acts like the numbers are objective facts. They aren't. They're someone's judgment calls about how species behave, what waste they produce, and how to weight conflicting evidence. The judgment can be reasonable or sloppy. The honest thing to do is show the work so you can decide whether the calculator's reasoning matches yours.

Two things this page is not. It's not a peer-reviewed scientific paper; the data comes from hobby consensus, breeder experience, and well-known reference sources. And it's not a static document. The methods evolve as more species land, as rules get tested against real edge cases, and as calibration drifts get noticed. Significant changes are dated below.

Contents

Bioload coefficients and tank capacity

The stocking calculator measures fish in "neon equivalents." A neon tetra is 1.0. Every other species is calibrated against that anchor. A bristlenose pleco is 6.0, meaning one bristlenose puts roughly the same waste load on a tank as six neon tetras. This is the closest the hobby has to a common unit.

The starting formula for a species coefficient is:

coefficient ≈ (adult_size_cm / 4) ^ 2.5  ×  waste_factor  ×  activity_factor

With:

  • waste_factor: 0.7 for herbivores, 1.0 for omnivores, 1.4 for carnivores
  • activity_factor: 0.8 for sedentary species, 1.0 for normal, 1.3 for active swimmers

The 2.5 exponent comes from observed scaling: a fish twice as long doesn't produce twice the waste, it produces about 5-6x. The exponent isn't derived from a paper; it's tuned to match hobbyist consensus for the ~25 most common species. A different exponent would give an internally consistent but differently-calibrated calculator.

The formula breaks at the extremes. Below 3 cm the exponent compresses the coefficient too low (an ember tetra by formula is 0.18, which understates the reality that tiny fish still need water and produce ammonia). Above 15 cm the exponent compounds too aggressively (an oscar would compute to 415+ neon equivalents, which is absurd; real-world consensus is 50-60). Both extremes get adjustments documented in the per-species rationale.

Tank capacity is then computed as:

capacity_units = (volume_liters / 4) × planted_mult × filter_mult × wc_mult

With:

  • planted_mult: 1.0 (none) / 1.3 (lightly planted) / 1.5 (heavily planted with fast growers)
  • filter_mult: 1.0 (adequate) / 0.7 (undersized)
  • wc_mult: 0.7 (monthly) / 0.85 (biweekly) / 1.0 (weekly 25%) / 1.15 (weekly 50%)

The /4 divisor calibrates against the rule of thumb that a healthy 75 L (20 gal) tank with moderate care holds 6-8 neons plus a few support fish. The number isn't arbitrary; change it and the entire calculator drifts off hobby consensus. Adjust the multipliers if you want stricter or looser stocking advice.

The 50/80/100/130 percent bands

The bioload meter shows where the roster sits on a green/amber/red scale:

  • Under 50% (green): comfortably stocked, lots of headroom, room to add more
  • 50-80% (green-amber): properly stocked, the sweet spot for community tanks
  • 80-100% (amber): fully stocked, no room for additions, water changes need to be on schedule
  • 100-130% (red-amber): overstocked for casual care, can work with weekly 50% changes and oversized filtration
  • Over 130% (red): genuinely over capacity, the calculator stops recommending further additions

These bands are softer than they look. A tank at 95% with weekly water changes and a heavily planted setup runs cleaner than a tank at 60% with a neglected filter and monthly changes. The percentages are reference points, not edicts.

Compatibility rules

The calculator runs every roster through 24 rules. Each rule is a pure function that inspects the fish in the roster and the tank state, then returns zero or more findings tagged with a severity level: error (this combination doesn't work), warning (this is risky and you should think about it), or info (this is fine and here's context).

The current rules:

  1. Schooling health. Each schooling species has three thresholds: critical, recommended, thriving. Below critical is a hard error; below recommended is a warning; above thriving is an info note.
  2. Water parameter overlap. Computes the intersection of temperature, pH, and hardness ranges across the roster. No overlap is an error. Touching boundaries (one species' max equals another's min) count as no overlap.
  3. Fin nipper with long-finned tankmate. Tiger barbs and serpae tetras vs bettas, angelfish, gouramis, guppies. Warning, not error, because group size mitigates the behavior.
  4. Tank size minimum. Each species has a minimum tank volume. Smaller tanks raise an error.
  5. Temperature band tightness. Even when ranges overlap, a 1°C or smaller intersection raises a warning since keeping both species at the edge of their tolerance is fragile.
  6. Jumper without a lid. Info-level reminder for jumper species so the user double-checks the lid before adding.
  7. Substrate mismatch. Sand-required species (kuhli loaches, cories) in gravel substrate is an error; the fish can't sift or burrow naturally.
  8. Plant eaters with soft plants. Three severity levels depending on the species (may_nibble_soft is a warning; eats_soft_plants is an error; destroys_most_plants is an error with extended advice).
  9. Shrimp eaters with shrimp. Adult cherry shrimp in tanks with shrimp-unsafe fish is an error.
  10. Flow mismatch. Hillstream loaches and other high-flow species in low-flow community tanks is a warning.
  11. Aggression mismatch. Peaceful species in tanks with aggressive species is a warning.
  12. Wild-caught species note. Info-level reminder when wild-caught species are added (kuhli loaches, otocinclus, chili rasboras) since survivability is worse than for tank-bred stock.
  13. Difficulty mismatch. Mixing beginner species with advanced-care species raises a warning since the harder species' parameter and care requirements will drive the whole tank's complexity.
  14. Plants eaten by specific fish. Cross-references plants in the roster against fish plant_interaction flags. Cabomba in a molly tank fires.
  15. Aggressive territorial pairing. Two aggressive or semi-aggressive species in the same picker category (two cichlids, two gouramis-bettas) is an error since they defend overlapping space. Two from different categories is a warning.
  16. Narrow parameter overlap. When temperature, pH, or hardness ranges technically overlap but the intersection is tight (under 2°C, 0.5 pH, or 4 dGH), warning. Both species would be living at the edge of their tolerance.
  17. Predator and small tankmates. Predator-flagged species with prey under 1/3 of their adult size is a warning; under 1/4 is an error. Angelfish + neon tetras lands here.
  18. Zone overcrowding. Three or more species in the top zone, three or more in bottom, or four or more in mid-water raises an info note suggesting the tank's vertical space could be used better.
  19. Lighting preference mismatch. Bright-light and dim-preferred species in the same roster raises an info note recommending floating plants or hardscape overhangs to create both zones.
  20. Maturity behavior shift. Species flagged as changing behavior at adult size (angelfish becoming predators, convict cichlids becoming aggressive, common goldfish outgrowing tanks, tiger barbs becoming notable fin-nippers) raise an info note so the user plans for the adult fish, not the juvenile in the store.
  21. Breeding-pair territoriality. Cichlids form bonded pairs that defend territory aggressively, often more aggressively than singletons. Any cichlid in the roster raises an info note about what happens when a pair forms.
  22. Surface-air-breather tank shape. Species that must surface to breathe atmospheric air (labyrinth fish, African dwarf frogs, weather loaches) raise a warning when housed in tall narrow tanks. Footprint-to-height ratios under 0.5 trigger the rule. Standard rectangular tanks pass.
  23. Lid compromise advice. When a roster contains both a jumper and a surface-air-breather (very common in tanks with bettas, gouramis, or panchax killifish), an info note explains the standard compromise: a sealed glass lid with a small air gap (around 1 cm) lets the air-breathers gulp atmospheric air while preventing the jumpers from escaping. Avoids the common mistake of choosing between "tight lid that suffocates labyrinth fish" or "open top that lets jumpers escape."
  24. Brackish-water indicators. When most of a roster is brackish-tolerant and no soft-water species are present, an info note suggests light brackish setup as an option. Strictly optional; the roster works fine in freshwater too.

The rule engine covers the common cases with these 23. Real stocking decisions involve aquascape details, individual fish personality, source-store quality, and the keeper's experience, none of which a rule engine sees. The calculator is a starting point for thinking about a roster, not the final word.

Popularity scoring

Each fish has an integer popularity score from 0 to 15 that drives the recommender's defaults. It's not a quality rating. It expresses how visible and well-loved the species is across the freshwater hobby, used as one component of how the recommender ranks suggestions. A score of 0 doesn't mean a bad fish; it means we shouldn't surface it as a default recommendation to new keepers.

ScoreMeaning
14-15"Everybody keeps these." Cherry shrimp, neon tetra, harlequin rasbora.
11-13Mainstream community staples. Cardinal tetra, honey gourami, bristlenose pleco.
8-10Popular but with caveats. Otocinclus (wild-caught), kuhli loach (specialized care), zebra danio (fin nipper).
5-7Kept regularly but harder to slot into mixed communities. Mollies (plant issues, hard water), swordtails (jumper).
2-4Niche. Endler's livebearer (hybridizes with guppies), pearl danio.
0-1Should not be surfaced as a default. Common pleco (outgrows tanks), wild bettas (specialist care), discus (high difficulty).

Specific adjustments applied to baseline scores:

  • Wild-caught species lose 2 points (cardinal tetra would be 14 if tank-bred, lands at 12).
  • Species that outgrow typical home tanks score 0-2 regardless of how widely sold.
  • Fin nippers and jumpers lose 1-2 points because they restrict community options.
  • Species with strict hardness or temperature requirements get penalized lightly.
  • Hardy beginner species that work in almost any community get the top scores.

The score is integer, not decimal. Hand calibration on whole numbers is faster and more honest than pretending we have fractional precision on a judgment call.

Confidence levels

Every numeric field in a species or plant file carries a confidence rating: high, medium, or low.

  • High: multiple reliable sources agree within a narrow range, or the value is widely-tested hobby consensus. Most common species' parameters land here.
  • Medium: sources roughly agree but with noticeable spread, or a single authoritative source provides the value without strong corroboration.
  • Low: limited data, conflicting sources, or the value is an educated estimate. Rare. We try to avoid shipping low-confidence values; species with too much low-confidence data don't get added until better information surfaces.

The calculator currently treats all three confidence levels equally for math purposes. Surfacing confidence to users is a future improvement; for now, look at the per-species profile page if you want to see which fields are firm and which are estimates.

Data sources

Per-species references are listed in each fish or plant profile under "Verified against." The sources rotated through most often:

  • Seriously Fish. The gold standard for freshwater species profiles. Detailed care, native habitat, breeding notes, and compatibility for most aquarium species.
  • FishBase. Academic-style species database. Better for taxonomy, distribution, and biology than for hobby care notes, but a useful cross-check on parameters.
  • Aquarium Co-Op. Video and article content from a working fish store with strong hobby visibility. Useful for stocking advice and modern community-tank context.
  • Tropica. Plant nursery with detailed care profiles for most aquarium plants in the trade. The default reference for plant parameters.
  • Buce Plant. Specialty plant supplier with care notes for bucephalandra and other premium plants.

When sources disagree, the discrepancy is documented in the species file's bioload_basis or notes field. Resolution priority: Seriously Fish for hobby care, FishBase for taxonomy, Tropica for plants. Where all sources disagree, hobby consensus from multiple forums and YouTube channels gets the deciding vote.

What the calculators don't do

Some things the stocking calculator can't tell you, and won't pretend to:

  • Whether the fish you bought is healthy. A correctly-stocked tank can still lose fish to disease, especially from chain-store purchases. Quarantine new fish for 2-4 weeks regardless of what the calculator says about compatibility.
  • Whether your tap water actually matches the species' parameter needs. The calculator checks species compatibility against each other. It doesn't know what comes out of your tap. Test your water before committing to demanding species.
  • Individual fish personality. Some "peaceful" species individuals are bullies; some "semi-aggressive" individuals are pussycats. The species-level data describes typical behavior, not guarantees.
  • Specific aquascape details. A 75 L tank might fit a roster on bioload but be wrong because the layout has no cover for the species that need hiding spots. The calculator doesn't see your hardscape.
  • Long-term planning. Some species (angelfish, gouramis) are peaceful as juveniles and aggressive as adults. The calculator currently flags this in compatibility notes but doesn't model the time dimension explicitly.
  • Breeding effects. A roster that works with one of each sex might fall apart once a pair forms and starts defending territory.

The output of the calculator is meant to be a starting point for a stocking decision, not a substitute for one.

Corrections and updates

If you spot data that's wrong (a parameter range that doesn't match your experience, a species that's mis-flagged on plant-safety, a compatibility note that ignores something obvious), email support@scaleandstem.com. Include the species slug, the field that's wrong, and why; if you have a source, link it. Substantive corrections that match across multiple references get applied within a few days.

The methodology on this page changes too. The formula coefficients, rule logic, and popularity scoring are all under continuous quiet revision as more species ship and edge cases surface. Major changes get a dated note at the top of the page.