Dots & Bloops

Custom Progression · Format Guide

Rewrite the entire economy — every cost curve, generator rate, perk value and unlock threshold across both the Dots and Bloops halves — by pasting a single JSON object into the game.

← Back to the game
On this page
  1. How to use it
  2. What you can and can't change
  3. The shape of the JSON
  4. Upgrade categories (merge by id)  ·  Effects
  5. Level perks (merge by lvl)
  6. Global constants & economy
  7. Generator tier upgrades
  8. Worked examples
  9. Notes & FAQ

1 · How to use it

  1. Open the game and click Custom Progression in the top bar (visible in both the Dots and Bloops modes).
  2. Click Reset editor to default template. The editor fills with the game's current default numbers as JSON — this is the exact schema the loader expects, so it's the best starting point.
  3. Edit any values you like. You can also delete everything you're not changing — anything you omit keeps its default (see §3).
  4. Make sure the toggle is set to Custom, then click Apply Custom Progression.
  5. The page reloads and the whole game rebuilds from your numbers. Your save is kept — only the rules change, not your progress.

To go back, open the menu, switch the toggle to Default, and click Use Default Progression. Your custom JSON stays saved in the editor for next time.

It can't break your game. If the JSON is invalid you'll get an error and nothing is applied. If a single field is the wrong type or names something that doesn't exist, that one field is skipped with a note and everything else still applies. A broken stored config silently falls back to defaults on load.

2 · What you can and can't change

Everything in the progression is tunable — not just the costs, but the actual effect of every upgrade. Each tree/shop node and each core Dots upgrade carries an effect descriptor (see §5), so you can make "Spark" give ×10 Bloops instead of ×2, turn a flat bonus into a per-level one, retune rover speed, the prestige multiplier, the XP curve, the generator-tier multiplier — all of it.

cost curves level caps upgrade effects generator rates perk values unlock thresholds reset & prestige economy XP curve tier cost & multiplier continuous level bonuses names & descriptions

The only things you can't do: change the wiring between nodes (prereqs), or add brand-new upgrades — an id that doesn't already exist has nothing behind it, so it's rejected with a note. Everything else is fair game.

3 · The shape of the JSON

The top level is a single JSON object. Every key is optional — include only what you want to change. There are three kinds of keys:

So this minimal example only makes Dot Value cheaper and slows the XP curve — everything else stays default:

{
  "basic": [ { "id": "dotValue", "baseCost": 3 } ],
  "xpGrowth": 1.5
}
JSON only. No comments, no formulas, no trailing commas — just numbers and strings. (The snippets on this page colour // like this for readability only; don't paste comments in.)

4 · Upgrade categories

Each is an array of objects identified by id. The table lists which fields you may set; any other field is ignored.

Cost model

Dots half

KeyWhat it isEditable fields
basicThe three core Dots upgrades (Dot Value, Capacity, Rate) name · baseCost · growth · max · effect
treeSkill-tree nodes (paid in dots, reset on Reset) name · desc · cost · levels · costScale · tier · col · effect
rtreeReset-tree nodes (paid in RP, persist across resets) same as tree
prestigePrestige shop (paid in PP — rovers etc.) name · baseCost · growth · max · effect

Bloops half

KeyWhat it isEditable fields
funUpgClick & multiplier upgrades name · baseCost · growth · max · effect
funGensThe 12 generators (Auto-Clicker → Bloop Cosmos) name · baseCost · growth · rate
btreeBloop-tree nodes (paid in Bloops, reset on recycle) name · desc · cost · levels · costScale · tier · col · effect
sparkleShopSparkle prestige shop (permanent) name · baseCost · growth · max · effect

The ids in each category are fixed. Use Reset editor to default template to see them all — e.g. generators are cursor, granny, farm, factory, mine, portal, temple, bank, rocket, galaxy, rift, cosmos.

Effects — what each upgrade does

The effect field controls an upgrade's bonus. For the three basic upgrades it's simply a number (per-level strength):

For every tree and shop node, effect is a small descriptor object (or an array of them for a node that does two things). Shape:

{ "stat": "dotMul", "op": "mul", "base": 2, "per": "once" }

Examples: {"stat":"dotMul","base":2} = ×2 Dots when owned · {"stat":"dotMul","base":1.5,"per":"level"} = ×1.5 Dots per level · {"stat":"capAdd","op":"add","base":3,"per":"level"} = +3 capacity per level.

A few special effects: magnet (any value owned turns it on), {"stat":"vastReach","table":[0,0.1,...]} (a per-level lookup table), and dotPerNode (Scale Dots: ×Dots grows with how many tree nodes you own).

statFeedsUsed by (default)
dotMul× all Dotsp1/p3/p7/p17, r1/r5/r8/r13/r15/r18/r20, Prestige Power
spawnRateMul× dot spawn rate (faster)p2/p4, r2/r12
capMul · capAdd× / + field capacityp5, r6/r17 · r3
rangeMul× collection rangep6/p10/p14, r4/r7/r14
xpMul× XP gainp11, r10/r11
rpMul× Reset Point gainp20, r9/r16/r19
dotValueMaxAdd+ Dot Value max levelsp15
dotPerNode+ ×Dots per tree node ownedp9
offlineAdd+ offline earning fractionp13 (Idle Engine)
magnetdots drift to cursor (on/off)p8
rovers · roverSpeedMul · roverRangeMulrover count / speed / rangePrestige shop
bloopMul× all Bloopsmult/mult2, b1/b4/b7/b9/b11, sAll/sMega
clickMul× click powerb2/b5, sClick
genMul× generator outputb3/b6/b8/b10, sGen
clickBaseAdd+ base Bloops per clickclickPow
sharpClick+ fraction of Bloops/sec added to clicksclickPct
vastReachBloops/click per generator (table)vastReach
sparkleGainAdd+ Sparkle gain fractionsGain
keepGens+ generators kept through a recyclesHead
Make "Spark" ten times stronger:
{ "btree": [ { "id": "b1", "name": "Mega Spark", "desc": "×10 Bloops",
                "effect": { "stat": "bloopMul", "base": 10 } } ] }

A node's desc/name is display text only — update it too when you change an effect so the card matches (the prestige and shop cards regenerate their numbers automatically; tree-node text does not). An unknown stat is ignored.

5 · Level perks

Both halves share one level. Milestone perks fire at a level and are permanent. Merge these by lvl; you can change a perk's strength (v), type or desc.

KeyGranted totype values
levelPerksDots half dot, rp, range, xp×v;  cap+v base capacity
bloopPerksBloops half bloop, click, gen×v
{
  "levelPerks": [
    { "lvl": 5,  "type": "dot", "v": 3,  "desc": "×3 Dots" },
    { "lvl": 3,  "type": "cap", "v": 2,  "desc": "+2 base Dot Capacity" }
  ]
}

Editing a perk's lvl isn't supported (the level it fires at is its identity) — change v/desc instead. Set v to 1 to neutralise a multiplier perk.

6 · Global constants & economy

These are plain top-level numbers (a couple are number arrays). Replace any of them:

KeyMeaningDefault
xpBaseXP curve base — reach level N at xpBase × xpGrowth^(N-1)15
xpGrowthXP curve growth (lower = level faster)1.4
bloopXpOffsetOrders of magnitude of lifetime Bloops before they add level XP1.0
bloopOrdersPerLevelOrders of magnitude of Bloops per level of contribution0.5
treeUnlockDotsLifetime dots to unlock the Skill Tree300
resetUnlockDotsLifetime dots to unlock Reset500000
btreeUnlockBloopsLifetime Bloops to unlock the Bloop Tree1000
sparkleUnlockBloopsLifetime Bloops to unlock Sparkles1000000
resetMinDotsRun-dots floor to reset; also scales RP (with rpBase/rpExp)500000
rpBase · rpExpRP gain = rpBase × (runDots/resetMinDots)^rpExp3 · 0.55
prestigeMinRPRP floor to prestige; PP = floor(√(RP/prestigeMinRP))500
funSparkleDivRecycle divisor — Sparkles ≈ √(lifetimeBloops/funSparkleDiv)200000
offlineBaseRateFraction of live rate earned while away (base; Idle Engine adds via its effect)0.25
offlineCapHoursOffline earnings stop after this many hours8
offlineMinSecsIgnore gaps shorter than this30
dotLevelMulContinuous × Dots per player level1.04
bloopLevelMulContinuous × Bloops per player level1.03
sparkleBloopBonus× Bloops added by each Sparkle held0.10
genTierMultOutput multiplier per generator tier upgrade bought2
roverSpeedBase · roverRangeBaseBase rover speed (px/s) / pickup radius (px)50 · 9
baseRadiusStarting collection radius (px)14
baseSpawnStarting seconds between dot spawns3.5
dotRVisual dot radius (px)4
fieldW / fieldHLogical play-field size (px)280 / 430
funGenTierThresholdsArray[7] — units owned to unlock each generator tier[1,5,25,50,100,150,200]
funGenTierCostMultsArray[7] — tier price = generator base × this[1,5,50,500,50000,5e6,5e9]

7 · Generator tier upgrades

Each Bloops generator has 7 Cookie-Clicker-style tier upgrades, each multiplying that generator's output by genTierMult (default ×2). You control the multiplier, when they unlock, and what they cost:

{
  "funGenTierThresholds": [1, 10, 25, 50, 100, 200, 300],
  "funGenTierNames": {
    "cursor": ["Faster", "Quicker", "Snappy", "Rapid", "Blazing", "Hyper", "Instant"]
  }
}

8 · Worked examples

A · "Speedrun" — everything cheaper, faster levels

{
  "basic": [
    { "id": "dotValue", "baseCost": 3, "growth": 1.6, "max": 50 },
    { "id": "capacity", "baseCost": 5, "growth": 1.7 }
  ],
  "xpGrowth": 1.25,
  "treeUnlockDots": 50,
  "resetUnlockDots": 50000,
  "resetMinDots": 50000
}

B · "Idle empire" — beefier Bloops generators

{
  "funGens": [
    { "id": "cursor", "rate": 1,  "baseCost": 10 },
    { "id": "granny", "rate": 8,  "growth": 1.13 },
    { "id": "farm",   "rate": 50 }
  ],
  "funSparkleDiv": 100000,
  "sparkleShop": [
    { "id": "sGain", "baseCost": 2, "max": 25 }
  ]
}

C · "Hard mode" — steeper everything

{
  "basic": [ { "id": "dotValue", "growth": 2.8 } ],
  "tree":  [ { "id": "p1", "cost": 200 }, { "id": "p3", "cost": 1500 } ],
  "xpGrowth": 1.6,
  "prestigeMinRP": 2000
}

9 · Notes & FAQ

Does it affect both Dots and Bloops? Yes — one JSON object covers both halves. The Dots keys (basic, tree, rtree, prestige, levelPerks, the dots thresholds) and the Bloops keys (funUpg, funGens, btree, sparkleShop, bloopPerks, the tier arrays) live side by side.

Will applying reset my progress? No. Your save (dots, bloops, levels, owned upgrades) is untouched — only the rules change. The page reloads so everything rebuilds cleanly.

What if I set a cost below what I've already paid? Totally fine — you simply keep what you own; future purchases use the new prices.

Can I change what an upgrade does, not just its cost? Yes — that's the effect field (§5). Every tree/shop node and the core Dots upgrades expose it, so you can rescale any multiplier, flip flat bonuses to per-level, and so on.

Can I add a brand-new upgrade or generator? No. Effects are wired to known ids, so an unknown id has nothing behind it — it's skipped with a note. Retune the existing ones instead.

What happens to fields I leave out? They keep their default value. Omitting a key, an array entry, or a single field all mean "leave it as shipped."

It says "Applied with N notes" — is that bad? No. Notes flag fields that were skipped (a typo'd id, a wrong type). Everything valid still applied. Fix the flagged lines if you meant them to take effect.