Cookie Clicker Steam: Progression, Automation & Cheat Sheet banner

Cookie Clicker Steam: Progression, Automation & Cheat Sheet

Section: Games

Cookie Clicker is more fun when you decide how much of the grind you actually want to keep.

I started normally, played actively, left it AFK for a while, then moved to automation once repetitive clicking stopped being interesting. Eventually I started using the console for the achievements and mechanics whose main requirement is simply leaving the game running for an absurd amount of time.

This guide follows the same progression:

  1. Play normally.
  2. Automate repetitive clicking.
  3. Accelerate slow mechanics.
  4. Use targeted console commands.
  5. Directly unlock an achievement only as a fallback.
Back up your save first
Before touching the console, use Options -> Export save and keep the exported string somewhere safe.

Console commands can permanently alter save state.

1. Start with Better AutoClicker

The easiest first step is Better AutoClicker - Advanced Multi-feature Cookie Automation from the Steam Workshop.

It can automate:

  • Big Cookie clicks
  • Golden Cookies
  • Wrath Cookies
  • Reindeer
  • Wrinkler popping
  • Background clicking
  • 1-100 clicks per second

The mod also states that it does not disable Steam achievements.

Install from Steam Workshop

  1. Open Cookie Clicker in your Steam Library.
  2. Open Workshop.
  3. Search for: Better AutoClicker - Advanced Multi-feature Cookie Automation
  4. Subscribe.
  5. Restart Cookie Clicker.
  6. Open the game's mod/options menu and enable it.

The Workshop item is currently discontinued, so it may stop working after a future Cookie Clicker update. If Steam fails to install it correctly, the author's GitHub version can be placed manually into:

Text
Cookie Clicker/mods/local/

For normal progression, my preferred configuration is:

Text
Big Cookie:        enabled
Golden Cookies:    enabled
Wrath Cookies:     optional
Reindeer:          enabled
Wrinkler popping:  disabled unless farming them
Clicks/sec:        whatever feels reasonable

This alone removes most of the boring mechanical clicking while leaving the actual progression systems intact.


2. Enable the Steam DevTools without disabling achievements

Cookie Clicker's Steam build has a developer flag in:

Text
Cookie Clicker/resources/app/start.js

You can find the game directory from:

Text
Steam -> Cookie Clicker -> Manage -> Browse local files

Normally, changing:

Js
let DEV=0;

to:

Js
let DEV=1;

opens the developer tools, but developer mode disables Steam achievements.

Instead, leave:

Js
let DEV=0;

Then find:

Js
if (DEV) win.webContents.openDevTools();

and replace it with:

Js
win.webContents.openDevTools();

Restart the game.

You now get Chromium DevTools while DEV remains 0, so the game is not running in developer mode.

Tip
Game updates or Steam file verification may overwrite start.js. If the console suddenly disappears after an update, check this modification again.

Use the Console tab for everything below.


3. Basic console commands

Check a value

Js
Game.cookies
Js
Game.lumps
Js
Game.UpgradesOwned

Add cookies

Js
Game.cookies += 1000000000;

Set cookies exactly

Js
Game.cookies = 1000000000000;

Add Sugar Lumps

Js
Game.lumps += 100;

Set Sugar Lumps

Js
Game.lumps = 1000;
Avoid
Infinity Commands such as Game.cookies = Infinity destroy most remaining progression. Targeted acceleration is much more useful than nuking the entire economy.

4. Golden Cookies

Js
new Game.shimmer('golden', { noWrath: true });

Spawn four simultaneously

Useful for Four-leaf cookie:

Js
for (let i = 0; i < 4; i++) {
    new Game.shimmer('golden', { noWrath: true });
}

Do not click them until all four are visible.

Spawn and instantly click Golden Cookies

Js
for (let i = 0; i < 100; i++) {
    (new Game.shimmer('golden', { noWrath: true })).pop();
}

Auto-click existing Golden Cookies

Js
window.autoGolden = setInterval(() => {
    Game.shimmers.forEach(s => {
        if (s.type === 'golden' && !s.wrath) s.pop();
    });
}, 250);

Stop:

Js
clearInterval(window.autoGolden);

Cookie Storm is the effect that throws many small Golden Cookies onto the screen.

Js
let gc = new Game.shimmer('golden', { noWrath: true });
gc.force = 'cookie storm';
gc.pop();
Js
Game.shimmerTypes.golden.chain = 0;

5. Grimoire: refill magic instantly

Js
const M = Game.Objects['Wizard tower'].minigame;
M.magic = M.magicM;

Inspect:

Js
({
    magic: Game.Objects['Wizard tower'].minigame.magic,
    max: Game.Objects['Wizard tower'].minigame.magicM
});

This is useful when farming Force the Hand of Fate without waiting for mana regeneration.


6. Sugar Lumps

Make the current lump Golden

Js
Game.lumpCurrentType = 2;

Types:

Text
0 = Normal
1 = Bifurcated
2 = Golden
3 = Meaty
4 = Caramelized

Make lump stages much faster

Js
Game.lumpMatureAge /= 100;
Game.lumpRipeAge /= 100;
Game.lumpOverripeAge /= 100;

For effectively instant testing:

Js
Game.lumpMatureAge = 1;
Game.lumpRipeAge = 1;
Game.lumpOverripeAge = 1;

Some game recalculations may restore these values.

Set lifetime harvested lumps

Js
Game.lumpsTotal = 365;

This is useful for lump-count achievement cleanup.


7. Garden acceleration

The Garden normally wastes a lot of real-world time because mutations are only rolled on ticks.

Force Garden ticks every 500 ms

Js
window.fastGarden = setInterval(() => {
    Game.Objects['Farm'].minigame.nextStep = 0;
}, 500);

Stop:

Js
clearInterval(window.fastGarden);

Do not make it too fast unless you are watching the Garden - plants can mature and die before you react.

Unlock every Garden seed

Js
const M = Game.Objects['Farm'].minigame;

for (const key in M.plants) {
    M.unlockSeed(M.plants[key]);
}

Refresh the Garden UI if necessary:

Js
Game.Objects['Farm'].minigame.buildPanel();

Seedless to nay

Once the seed log is complete, use the Garden's normal Sacrifice garden button.

That is preferable to directly unlocking the achievement because you still perform the actual Garden mechanic.

Fallback:

Js
Game.Win('Seedless to nay');

8. Stock Market acceleration

Faster market ticks

Js
window.fastMarket = setInterval(() => {
    Game.Objects['Bank'].minigame.tick();
}, 500);

Stop:

Js
clearInterval(window.fastMarket);

Check current profit

Js
Game.Objects['Bank'].minigame.profit

Simple auto trader

This aggressively buys stocks far below their resting value and sells them after a reasonable recovery.

Js
(() => {
    const M = Game.Objects['Bank'].minigame;

    if (window.autoStockBot) {
        clearInterval(window.autoStockBot);
    }

    window.autoStockState = window.autoStockState || {};

    window.autoStockBot = setInterval(() => {
        M.goodsById.forEach((g, i) => {
            const resting =
                10 * (i + 1) +
                Game.ObjectsById[i].level - 1;

            const ratio = g.val / resting;

            const state = window.autoStockState[i] ||= {
                buyPrice: null
            };

            if (
                g.stock === 0 &&
                ratio < 0.55 &&
                g.mode !== 4 &&
                g.mode !== 5
            ) {
                const before = g.stock;

                M.buyGood(i, 1000000);

                if (g.stock > before) {
                    state.buyPrice = g.val;

                    console.log(
                        `BUY ${g.symbol} @ $${g.val.toFixed(2)}`
                    );
                }

                return;
            }

            if (g.stock > 0) {
                const profitable =
                    state.buyPrice === null ||
                    g.val > state.buyPrice * 1.10;

                const expensive = ratio > 1.25;

                const trendExit =
                    g.mode === 4 ||
                    (ratio > 1.0 && g.d < 0);

                if (
                    profitable &&
                    (expensive || trendExit)
                ) {
                    console.log(
                        `SELL ${g.symbol} @ $${g.val.toFixed(2)}`
                    );

                    M.sellGood(i, 1000000);
                    state.buyPrice = null;
                }
            }
        });
    }, 250);

    console.log('Auto Stock Bot started.');
})();

Stop:

Js
clearInterval(window.autoStockBot);
clearInterval(window.fastMarket);
Note
The Stock Market is intentionally noisy. This is an achievement/progression accelerator, not some mathematically perfect trading strategy.

Liquid assets

Set profit just below $10 million:

Js
Game.Objects['Bank'].minigame.profit = 9999999;

Then make one profitable sale.

Fallback:

Js
Game.Win('Liquid assets');

Gaseous assets

Set profit just below $31.536 million:

Js
Game.Objects['Bank'].minigame.profit = 31535999;

Then make one profitable sale.

Fallback:

Js
Game.Win('Gaseous assets');

9. Wrinklers

Inspect active Wrinklers

Js
Game.wrinklers
    .map((w, i) => ({
        id: i,
        phase: w.phase,
        hp: w.hp,
        pokes: w.clicks
    }))
    .filter(w => w.phase > 0);

Check Wrinkler poker

Js
Game.Achievements['Wrinkler poker'].won

If you have already poked the same Wrinkler 50+ times but the achievement did not register because an automation script modified internal counters directly, use:

Js
Game.Win('Wrinkler poker');

Directly editing w.clicks is not equivalent to going through the game's actual poke event, so do not rely on that counter alone to trigger the achievement.


10. Seasons and event upgrades

Halloween

Js
Game.season = 'halloween';

Missing Halloween cookie upgrades can be unlocked individually:

Js
[
    'Ghost cookies',
    'Bat cookies',
    'Slime cookies',
    'Eyeball cookies'
].forEach(name => Game.Unlock(name));

Then buy them normally.

Christmas

Js
Game.season = 'christmas';

Spawn Reindeer repeatedly:

Js
window.fastReindeer = setInterval(() => {
    new Game.shimmer('reindeer');
}, 1000);

Stop:

Js
clearInterval(window.fastReindeer);

Easter

Js
Game.season = 'easter';

Then rapidly roll Golden Cookie drops:

Js
window.fastGolden = setInterval(() => {
    (new Game.shimmer('golden', { noWrath: true })).pop();
}, 500);

Stop:

Js
clearInterval(window.fastGolden);

11. Krumblor upgrades

The four petting drops are:

Text
Dragon scale
Dragon claw
Dragon fang
Dragon teddy bear

If you only need them available for purchase:

Js
[
    'Dragon scale',
    'Dragon claw',
    'Dragon fang',
    'Dragon teddy bear'
].forEach(name => Game.Unlock(name));

Then buy them normally.


12. Inspect missing upgrades

In the current Steam build, Game.UpgradesById may behave like an object rather than a normal Array, so wrap it with Object.values().

Every unbought non-debug upgrade

Js
Object.values(Game.UpgradesById)
    .filter(u => !u.bought && u.pool !== 'debug')
    .map(u => ({
        name: u.name,
        pool: u.pool,
        unlocked: u.unlocked,
        price: u.getPrice ? u.getPrice() : u.basePrice
    }));

Locked upgrades only

Js
Object.values(Game.UpgradesById)
    .filter(u => !u.bought && !u.unlocked && u.pool !== 'debug')
    .map(u => ({
        name: u.name,
        pool: u.pool
    }));

Unlock all normal non-prestige upgrades

This makes them available in the store without marking them purchased:

Js
Object.values(Game.UpgradesById).forEach(u => {
    if (
        !u.bought &&
        u.pool !== 'debug' &&
        u.pool !== 'prestige'
    ) {
        u.unlocked = 1;
    }
});

Game.RebuildUpgrades();

You can then buy the remaining upgrades normally and let purchase-count achievements trigger naturally.

Purchase 700 upgrades

Check:

Js
Game.UpgradesOwned

Fallback:

Js
Game.Win("Oft we mar what's well");

13. Achievement counter cleanup

Click 27,777 Golden Cookies

Inspect:

Js
Game.goldenClicks

Set it one short:

Js
Game.goldenClicks = 27776;

Then spawn and click one:

Js
(new Game.shimmer('golden', { noWrath: true })).pop();

Fallback:

Js
Game.Win("Black cat's paw");

Cast 999 spells

Inspect:

Js
Game.Objects['Wizard tower'].minigame.spellsCastTotal

Set to 998:

Js
Game.Objects['Wizard tower'].minigame.spellsCastTotal = 998;

Then cast one real spell.

Fallback:

Js
Game.Win('A wizard is you');

Ascend 100 times

Inspect:

Js
Game.resets

Directly setting the counter:

Js
Game.resets = 100;

may not trigger the achievement by itself because Cookie Clicker does not expose a generic Game.checkAchievements() function in the current build.

Fallback:

Js
Game.Win('Reincarnation');

14. Legacy older than one year

The important variable is Game.fullDate, not Game.startDate.

Game.startDate describes the current run/ascension. The Stats screen's Legacy started age comes from the full legacy timestamp.

Set it to slightly more than one year ago:

Js
Game.fullDate = Date.now() - (366 * 24 * 60 * 60 * 1000);

Verify:

Js
(Date.now() - Game.fullDate) / 86400000

Stats should now show approximately:

Text
Legacy started: 366 days ago

Fallback:

Js
Game.Win('So much to do so much to see');

15. Ascend with exactly 1 trillion cookies

For When the cookies ascend just right:

Js
Game.cookies = 1000000000000;

Verify:

Js
Game.cookies

Then ascend normally.

If production changes the number before you can ascend, use the direct fallback:

Js
Game.Win('When the cookies ascend just right');

16. Born Again challenge achievements

These are better done together instead of individually hacking them.

Use:

Text
Ascend
-> Challenge mode
-> Born Again
-> Reincarnate

Born Again temporarily disables prestige/heavenly advantages for that run. It does not permanently erase your normal heavenly upgrades.

Try to combine:

  • Speed baking II
  • Speed baking III
  • Neverclick
  • True Neverclick
  • Hardcore

into one run.

True Neverclick + Neverclick

Do not click the Big Cookie at all.

Golden Cookies can bootstrap your first cookies, then buildings take over.

Useful check:

Js
Game.cookieClicks

For True Neverclick it must remain:

Text
0

Speed baking II / III

Reach 1 million cookies within:

Text
Speed baking II  = 25 minutes
Speed baking III = 15 minutes

Semi-hack:

Js
Game.Earn(999000);

Then earn the final amount naturally.

Hardcore

Reach 1 billion cookies without buying upgrades.

Buildings are fine. Upgrades are not.

Fallback commands:

Js
Game.Win('Speed baking II');
Game.Win('Speed baking III');
Game.Win('Neverclick');
Game.Win('True Neverclick');
Game.Win('Hardcore');

17. Direct achievement unlock pattern

Cookie Clicker exposes:

Js
Game.Win('Achievement name');

Examples:

Js
Game.Win('Wrinkler poker');
Game.Win('Seedless to nay');
Game.Win('Liquid assets');
Game.Win('Gaseous assets');
Game.Win('A wizard is you');
Game.Win('Reincarnation');
Game.Win("Black cat's paw");
Game.Win("Oft we mar what's well");
Game.Win('So much to do so much to see');
Game.Win('When the cookies ascend just right');

Check whether an achievement is already unlocked:

Js
Game.Achievements['Wrinkler poker'].won

Result:

Text
0 = locked
1 = unlocked
Prefer state -> trigger -> direct unlock
My preferred order is:
  1. Set a counter just below the requirement.
  2. Perform the final action normally.
  3. Use Game.Win(...) only if the game's internal trigger refuses to cooperate.

You still get to interact with the mechanic without spending hours or days on meaningless waiting.


18. Global speed and why it is not universal

Cookie Clicker normally runs game calculations around:

Js
Game.fps = 30;

You can experiment with:

Js
Game.fps = 300;

and restore:

Js
Game.fps = 30;

But this is not a universal 10x speed switch.

Garden, Stock Market, Sugar Lumps and other systems may use timestamps or their own timers. For those, use the targeted acceleration scripts earlier in this guide.


19. Stop every automation script

If you have copied several scripts during a session:

Js
clearInterval(window.autoGolden);
clearInterval(window.fastGarden);
clearInterval(window.fastMarket);
clearInterval(window.autoStockBot);
clearInterval(window.fastReindeer);

You can also inspect whether an interval variable exists:

Js
console.log({
    autoGolden: window.autoGolden,
    fastGarden: window.fastGarden,
    fastMarket: window.fastMarket,
    autoStockBot: window.autoStockBot,
    fastReindeer: window.fastReindeer
});

My preferred way to play

I would not start Cookie Clicker by instantly running:

Js
Game.RuinTheFun();

That skips basically everything worth discovering.

A better progression is:

Text
Vanilla
-> Better AutoClicker
-> targeted automation
-> accelerate waiting
-> manipulate achievement counters
-> direct Game.Win() only for cleanup

The game has enough systems - ascensions, Golden Cookie combos, Grimoire, Pantheon, Garden, Stock Market, seasons, Krumblor, Wrinklers and Sugar Lumps - that completely deleting the progression misses the point.

But once an achievement asks you to leave the game idling for weeks, months, or a literal year, I see no value in keeping a PC running 24/7 just to satisfy a timer.

Automate repetition. Accelerate waiting. Keep the mechanics that are still fun.

References