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 gameTo 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.
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.
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.
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:
id. List only the
upgrades you're editing, and within each only the fields you're editing.levelPerks, bloopPerks) — merged
by lvl.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
}
// like this for
readability only; don't paste comments in.)Each is an array of objects identified by id. The table lists which fields you
may set; any other field is ignored.
basic, prestige, funUpg,
sparkleShop): the price of the next level is
ceil(baseCost × growth^level), stopping at max levels.funGens): same curve, uncapped. Each unit owned
produces rate Bloops/sec (before tier and global multipliers).tree, rtree, btree): single
purchase by default. A node with levels > 1 charges
cost × costScale^(levelsOwned) per level. tier = its row,
col = its column in the diagram.| Key | What it is | Editable fields |
|---|---|---|
basic | The three core Dots upgrades (Dot Value, Capacity, Rate) | name · baseCost · growth · max · effect |
tree | Skill-tree nodes (paid in dots, reset on Reset) | name · desc · cost · levels · costScale · tier · col · effect |
rtree | Reset-tree nodes (paid in RP, persist across resets) | same as tree |
prestige | Prestige shop (paid in PP — rovers etc.) | name · baseCost · growth · max · effect |
| Key | What it is | Editable fields |
|---|---|---|
funUpg | Click & multiplier upgrades | name · baseCost · growth · max · effect |
funGens | The 12 generators (Auto-Clicker → Bloop Cosmos) | name · baseCost · growth · rate |
btree | Bloop-tree nodes (paid in Bloops, reset on recycle) | name · desc · cost · levels · costScale · tier · col · effect |
sparkleShop | Sparkle 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.
The effect field controls an upgrade's bonus. For the three basic
upgrades it's simply a number (per-level strength):
dotValue.effect — value multiplier per level (default 2 = doubles
= +100%; use 1.5 for +50%, 3 to triple).capacity.effect — extra dots on the field per level (default 1).dotRate.effect — spawn-interval multiplier per level (default 0.8
= 20% faster each level; lower is faster).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" }
stat — which bonus it feeds (table below). Required.op — "mul" (multiply, default) or "add" (add).base — the number applied.per — "once" (full effect if owned, default) or "level"
(scales with levels owned: base^level for mul, base×level for add).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).
| stat | Feeds | Used by (default) |
|---|---|---|
dotMul | × all Dots | p1/p3/p7/p17, r1/r5/r8/r13/r15/r18/r20, Prestige Power |
spawnRateMul | × dot spawn rate (faster) | p2/p4, r2/r12 |
capMul · capAdd | × / + field capacity | p5, r6/r17 · r3 |
rangeMul | × collection range | p6/p10/p14, r4/r7/r14 |
xpMul | × XP gain | p11, r10/r11 |
rpMul | × Reset Point gain | p20, r9/r16/r19 |
dotValueMaxAdd | + Dot Value max levels | p15 |
dotPerNode | + ×Dots per tree node owned | p9 |
offlineAdd | + offline earning fraction | p13 (Idle Engine) |
magnet | dots drift to cursor (on/off) | p8 |
rovers · roverSpeedMul · roverRangeMul | rover count / speed / range | Prestige shop |
bloopMul | × all Bloops | mult/mult2, b1/b4/b7/b9/b11, sAll/sMega |
clickMul | × click power | b2/b5, sClick |
genMul | × generator output | b3/b6/b8/b10, sGen |
clickBaseAdd | + base Bloops per click | clickPow |
sharpClick | + fraction of Bloops/sec added to clicks | clickPct |
vastReach | Bloops/click per generator (table) | vastReach |
sparkleGainAdd | + Sparkle gain fraction | sGain |
keepGens | + generators kept through a recycle | sHead |
{ "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.
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.
| Key | Granted to | type values |
|---|---|---|
levelPerks | Dots half | dot, rp, range, xp → ×v;
cap → +v base capacity |
bloopPerks | Bloops 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.
These are plain top-level numbers (a couple are number arrays). Replace any of them:
| Key | Meaning | Default |
|---|---|---|
xpBase | XP curve base — reach level N at xpBase × xpGrowth^(N-1) | 15 |
xpGrowth | XP curve growth (lower = level faster) | 1.4 |
bloopXpOffset | Orders of magnitude of lifetime Bloops before they add level XP | 1.0 |
bloopOrdersPerLevel | Orders of magnitude of Bloops per level of contribution | 0.5 |
treeUnlockDots | Lifetime dots to unlock the Skill Tree | 300 |
resetUnlockDots | Lifetime dots to unlock Reset | 500000 |
btreeUnlockBloops | Lifetime Bloops to unlock the Bloop Tree | 1000 |
sparkleUnlockBloops | Lifetime Bloops to unlock Sparkles | 1000000 |
resetMinDots | Run-dots floor to reset; also scales RP (with rpBase/rpExp) | 500000 |
rpBase · rpExp | RP gain = rpBase × (runDots/resetMinDots)^rpExp | 3 · 0.55 |
prestigeMinRP | RP floor to prestige; PP = floor(√(RP/prestigeMinRP)) | 500 |
funSparkleDiv | Recycle divisor — Sparkles ≈ √(lifetimeBloops/funSparkleDiv) | 200000 |
offlineBaseRate | Fraction of live rate earned while away (base; Idle Engine adds via its effect) | 0.25 |
offlineCapHours | Offline earnings stop after this many hours | 8 |
offlineMinSecs | Ignore gaps shorter than this | 30 |
dotLevelMul | Continuous × Dots per player level | 1.04 |
bloopLevelMul | Continuous × Bloops per player level | 1.03 |
sparkleBloopBonus | × Bloops added by each Sparkle held | 0.10 |
genTierMult | Output multiplier per generator tier upgrade bought | 2 |
roverSpeedBase · roverRangeBase | Base rover speed (px/s) / pickup radius (px) | 50 · 9 |
baseRadius | Starting collection radius (px) | 14 |
baseSpawn | Starting seconds between dot spawns | 3.5 |
dotR | Visual dot radius (px) | 4 |
fieldW / fieldH | Logical play-field size (px) | 280 / 430 |
funGenTierThresholds | Array[7] — units owned to unlock each generator tier | [1,5,25,50,100,150,200] |
funGenTierCostMults | Array[7] — tier price = generator base × this | [1,5,50,500,50000,5e6,5e9] |
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[t] of a generator to unlock tier t.generator.baseCost × funGenTierCostMults[t].genTierMult (a global constant, §6) sets the per-tier output multiplier.funGenTierNames sets the display names — an object keyed by generator id, each
value an array of 7 strings.{
"funGenTierThresholds": [1, 10, 25, 50, 100, 200, 300],
"funGenTierNames": {
"cursor": ["Faster", "Quicker", "Snappy", "Rapid", "Blazing", "Hyper", "Instant"]
}
}
{
"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
}
{
"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 }
]
}
{
"basic": [ { "id": "dotValue", "growth": 2.8 } ],
"tree": [ { "id": "p1", "cost": 200 }, { "id": "p3", "cost": 1500 } ],
"xpGrowth": 1.6,
"prestigeMinRP": 2000
}
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.