The record / preserved

Built in public.

These dated notes preserve what the project reported at the time. Early plans, timelines and feature states are historical records, not current product promises. For today's game, start on the homepage ↗.

Development notes

Devlog #HOWLitsMade — Siege Unfreeze + Real Combat Stats Wired 🐺

⚔️ Siege — major stability progress
• Tracked down the real `Next Fight` freeze path during active siege resolution
• Refactored siege duel flow so the duel itself no longer blocks the whole siege path the old way
• Added timeout protection + disk fallback for stuck user reads during duel resolution
• Confirmed duel now resolves instead of hard-freezing the bot

🧠 Combat truth — real stats now used
• Wired siege duel stats to the real `compute_full_stats()` pipeline
• Siege now reads actual full player totals instead of only raw/base stats
• Confirmed totals match correctly for real player data (base + gear + pet)

📜 Siege event flow
• Started wiring siege event/feed logging deeper into the backend flow
• Watch / launch / fight / result states are moving toward clearer player-facing visibility

✅ Net
Siege is no longer just conceptually working — the core fight loop now survives live execution and uses real player strength.

⚠️ Next
• Finish quick E2E checks for watch / active siege / final result branches
• Surface siege feed properly inside the modal so players can actually see battle progress
• Add simple anti-spam / loading state on `Next Fight`
• Keep tightening edge cases around state refresh and stale fight handling

Quiet progress. Hard part first. 🐺

Devlog #HOWLitsMade — Faction HQ Goes Live + Influence UX + Map Pin CSS Scoped 🐺

🏰 Faction HQ — now actually live
• Fixed WebApp auth/UID edge-case that caused 401 / wrong user context
• Members tracking is persistent (membersCount no longer stuck at 0)
• HQ Donate is confirmed working: pulls BOTH Bones + Scrap from player balance and fills treasury + feed

🗺️ Influence / Map — stability + clarity
• Verified /webapp/map/leaders returns leadersMap correctly
• Scoped pin styling to #pins to prevent modal soft-lock (map-pin transform no longer breaks Influence modal)
• Prepared full Influence.js upgrade: inline status box + clear reason messages (COOLDOWN / NOT_ENOUGH / etc.) + cooldown countdown on Patrol button

✅ Net
HQ is no longer a mock — it’s a real treasury loop. Map influence is functional and now moving into player-facing clarity.

⚠️ Next
• Ship the updated Influence.js (cache-bust WEBAPP_VER) and confirm cooldown/toasts UX on mobile + desktop
• Ensure Influence donate reads ledger-truth consistently (no false have=0)
• Make map feel “alive” after actions: always apply leadersMap / refresh pins immediately on success
• Optional: verify HQ Upgrade E2E (level/bonuses) once treasury has funds

Quiet progress. Real loop. 🐺

Devlog #HOWLitsMade — Factions Backend + HQ Foundation + Influence Routing Live 🛡️

🛡️ Factions — WebApp integration
• Rebuilt /choosefaction flow to use data_store + faction_core (no legacy load/save race)
• Added dedicated webapp_factions.py module (clean separation from dashboard)
• Hardened auth layer (no more 500 on missing init_data, proper 401 responses)
• Confirmed CORS + Telegram init verification working correctly

🏰 Faction HQ foundation
• Created faction_store.py (persistent faction treasury layer)
• Added /webapp/faction/hq/state endpoint
• Added donate handler writing to data/factions/<faction>.json
• Wired influence + faction logic separation

🗺️ Influence system sync
• Registered influence routes cleanly in make_state_app()
• Normalized building mapping for map → backend cohesion
• Fixed Telegram popup limitation (max 3 buttons) in faction picker

⚠️ Pending
• Frontend ensureFaction() currently loops due to local faction state mismatch vs backend truth
• Patrol + Donate blocked until state sync bridge is finalized

Net: Faction system is structurally live. Backend stable. UI-state reconciliation next.

Foundations before expansion. 🐺

Devlog #HOWLitsMade — Official Telegram App Center Listing 🎉

🚀 Alpha Husky officially joined Telegram App Center.

• Completed technical compliance requirements
• Finalized Stars-based support flow (Supporter + Patron)
• Confirmed WebApp production domain + API routing stability
• Passed CORS + auth verification under Telegram environment

This marks our first official ecosystem listing.
From a solo-built experiment to a verified Telegram Mini App.

Next: scale DAU, refine onboarding, and strengthen core loops.

One year building. Still here. 🐺🔥

Devlog #HOWLitsMade — Missions Loot Cleanup + WebApp Home Flow Rebuild + Forge Shards Craft Locked ✅

✅ Missions loot + UI cleanup
• Fixed the backend item catalog so Missions “possible rare drop” shows only real items that can actually drop (no ghost/locked items)
• Repaired broken/duplicated mission helpers so the loop is cleaner + consistent

🏠 WebApp Home rebuild
• Rebuilt Home into a clean Bottom Nav + Hub / Character / Share sheets flow
• Fixed BackButton + nav stack so modals behave properly (no weird back / stuck layers)
• Skins opens reliably again
• Polished hero-frame setup (overlay/frame behavior + modal blur) so the character card feels more premium + consistent

⚒️ Forge Shards craft — end-to-end locked in
Backend
• Shard balance is uid/ledger-truth first (no more mismatched “have vs UI”)
• Added run_id idempotency (plan → spend → apply → done) so retries don’t dupe or eat shards
• Craft uses deterministic roll plan per run_id + resume-safe inventory apply
• Added pity per slot (stored + returned) + roll config/pools debug for tuning
• Added Quest hook on craft (meta + rarity counts + uncommon+ totals) and made it idempotent per run_id
• Hardened inventory handling (no more empty refs / refresh glitches, better proof logs)

Front
• Updated forge.js to read pityMap properly, show cost/after preview, and keep local pity override
• Improved craft UX: shows results with rarity tags, handles backend made[] objects, richer debug on errors
• Added support for Epic/Legendary chances (display + effective probabilities) + stores last rollCfg from backend

Net: Forge craft is now stable, replay-safe, ledger-consistent, and ready for real players.

Rest is earned family 🐺🔥

Devlog #HOWLitsMade — FAQ Hub Rebuild + Rarity Glow + Visual Stability ✅

✅ Rebuilt the FAQ into a proper hub (clean sections, real info, no fluff)

✨ Equipment UI polish
• Rarity-based glow now matches item rarity (finally feels like a game)

🧼 Visual stability pass
• Fixed missing graphics / blank squares issues across the WebApp

🧰 Content drop
• Added new items / 1–2 gear sets live

⏭️ Next
• Keep rolling more small fixes + upgrades into “What’s New”
• Continue Missions polish toward the final look/feel

Rest is earned family 🐺🔥

Devlog #HOWLitsMade — Missions Timer Locked + Stylish Waiting Screen (WebApp) 🕒

✅ Missions → WebApp core flow progress
• Timer/countdown now holds stable (no more blinking back to offers)
• Added pending-start sync + state polling to bridge backend confirmation
• Waiting screen supports RUNNING → READY → Resolve properly

🧱 UI groundwork
• Missions sheet behavior improved (closer to a real feature, less like a random popup)
• Backgrounds wired for offers + waiting modes

⏭️ Next
• “Visual punch” pass: header, badges, stronger game framing (no backend rebuild)
• Tighten full-screen feel + presentation so it reads like a core game loop

Big step forward. Now it’s about making it look as good as it plays 🐺

Devlog #HOWLitsMade — Missions → WebApp: 404 Fixed + Routes Live + Mission Board Highlight 🐾

✅ Big blocker removed: Missions endpoints are now properly wired into the WebApp API (no more 404s).

🔧 1) Missions → WebApp routing fix
• Registered Missions routes on the correct aiohttp app (make_state_app)
• Confirmed live via /webapp/missions/ping
• Cleaned up legacy TG handler references that caused a startup crash (NameError)

🧭 2) Mission Board visibility update
• Mission Board UI was highlighted/cleaned up so it reads clearer as a core game loop entry

⏭️ Next (tomorrow)
• Final cutover: /mission in Telegram becomes “Open Missions (WebApp)”
• Disable old TG mission buttons/callbacks
• Full E2E run: state → refresh offers → start → countdown → resolve

Close to the finish line. WebApp-first missions are about to be fully locked in 🐺

Devlog #HOWLitsMade — Legendary Path Main Reward Preview + Limited-Time Skin Claim + Eclipse Raider Set 🌘🐺

✅ Today was about clarity + urgency + fresh content — making the WebApp feel more like a real game loop.

🏆 1) Legendary Path — Main Reward Preview (Mission Board)
Legendary Path now shows ONE main reward for the whole track (not per step), so it reads like a real progression path.
• Added track-level reward preview (shown once per Legendary Path card)
• Cloudinary-first icon handling (consistent with the rest of the project)
• Hard size cap to prevent the icon from taking over the entire quest card
• Track progress displayed as doneSteps/totalSteps for clean readability

🧬 2) Limited-Time Skin — claim window flow
A limited skin drop can now be claimed only during an active time window.
• One-time claim behavior + guard rails
• Designed to be run_id/idempotent friendly (spam-safe)
• Ready for optional code/password hunts for lore events

🌑 3) New gear content — Eclipse Raider set
Dropped a new gear set to expand rewards and keep the loot ecosystem moving.
• Prepared for future lootbox/shop rotations and WebApp inspect/compare

Not a noisy day — but a very real step forward. Brick by brick 🧱🐺

Devlog #HOWLitsMade — WebApp Salvage Back Online + Lootboxes Wired + Consumables Reconnected 🛠️🎁⚡

✅ Big stability day — bringing core loops back to life and making rewards actually feel real.

🧰 1) WebApp Salvage — restored + safe again
We brought salvage back online in the WebApp and made it reliable (no ghost gains / no half-applied state).
• Salvage applies inventory changes only after the ledger-side result is confirmed
• Clean output summary (Scrap/Shards yielded)
• Safer flow for duplicate cleanup

🎁 2) Lootboxes — Mystery/Premium/Legendary opening flow wired
We connected the box opening flow so boxes can be consumed and rewards can be applied correctly.
• Box open path moved into /webapp/inventory/use (sync-safe)
• Drop results apply through ledger-first logic and mirror into materials for UI
• Foundation ready for proper loot tuning (pools / rarity / pity)

⚡ 3) Consumables — effects restored + visible again
Consumables were reconnected so they actually do something when used.
• Effects execute properly on use
• UI displays the effect feedback (no more silent 'Used item')
• Buff/effect visibility path re-synced so players can tell what’s active

This was a systems day — not flashy, but it makes everything else scale and stay stable. Brick by brick 🧱🐺

Devlog #HOWLitsMade — Loot Tables Finalized + Boxes Activated + New Set + 3 New Consumables 🎁⚔️🧪

✅ Rewards day — boxes are live, loot logic is real, and the content pool got a serious upgrade.

🎲 1) loot_tables.py — closed + tuned (no longer 'next')
We finished the loot tables properly, including the real tuning knobs:
• Reward pools per box (Mystery / Premium / Legendary)
• Rarity odds + slot weights
• Pity rules to avoid dead streaks and keep openings exciting

🎁 2) Mystery/Premium/Legendary boxes — activated for players
Boxes are now usable end-to-end:
• Use box → roll drops → apply rewards → update balances → inventory refresh
• The goal is simple: opening a box should never feel empty

🧪 3) 3 new consumables + effects added
Added three new consumables to the pool and shipped their gameplay effects.
• Effects execute consistently
• Feedback shows up in UI so players know what they triggered

⚔️ 4) New gear set added
A new set is now part of the item universe and ready to appear through rewards.
• Integrated into the item pool cleanly
• Ready for drops / future event hooks

This was the missing piece for progression: rewards with structure, fairness, and momentum. 🐺

Devlog #HOWLitsMade — Pet Arena Scaling + Boxes Loot + Shop UX + Consumables ⚔️🐾🎁

✅ Today was all about turning rough systems into real long-term gameplay.

🐾 1) Pet Arena — proper stats + HP scaling (long-term fair play)
We fixed the core issue where pet power didn’t scale consistently with level, causing weird HP gaps (like 50 HP forever vs 400+ tanks).

What shipped:
• Canonical pet stat calculation via compute_pet_effective_stats()
• Arena uses one clean source of truth (no mixed legacy bonuses)
• Hybrid HP system (Step C):
- Level ALWAYS increases HP
- Vitality adds bonus HP, but capped to prevent extreme tank meta
- Tunable via ENV without patching code

Result:
• Pet levels finally matter
• Fights feel fairer across archetypes
• Huge future-proof base for real pet grinding

🎁 2) Loot Tables for Boxes
We added the loot table foundation for box rewards.
This unlocks scaling rewards like:
• shards
• materials
• special drops
• future cosmetics / event items

🛒 3) Shop — better purchase feedback
Shop purchase messaging is now cleaner and more readable.
Players immediately know:
• what they bought
• what it cost
• what changed in their balance

🧊 4) Prep for the Shardborn Skin
We prepared the structure so Shardborn can drop in cleanly as a cosmetic without breaking UI flow.
Ready for:
• unlock/purchase
• reward drop
• event-only release

⚡ 5) Consumables — real timed effects
Consumables are now wired to actually apply timed buffs instead of being “just an item”.
Next step is already planned:
• show active buffs visibly in UI (with remaining duration)

This wasn’t just content — it was the kind of systems work that makes the whole game scale smoothly. Brick by brick 🧱🐺

Devlog #HOWLitsMade — User Lock Datastore (Race-Condition Killer) ✅🐺

✅ FINAL PUSH: the "progress rolls back / disappears" ghost is now under control.

After fixing the root UID ghost (data[uid] vs data['users'][uid]), the next beast was even worse:

⚠️ The real nightmare:
• Telegram Bot + WebApp were both doing load_data() → mutate → save_data(data)
• In parallel requests, older snapshots were overwriting newer saves
• Result: random rollbacks, missing rewards, WebApp vs Bot desync

✅ What we shipped to kill it properly:
1) Tripwire protection (WebApp)
• save_data() is hard-disabled in webapp_dashboard.py on purpose
• any legacy save path crashes instantly instead of silently corrupting progress

2) New safe persistence layer: data_store.py
• per-user asyncio.Lock (one writer at a time)
• atomic writes (temp → rename)
• backups/rotation
• one rule:
READ = read_user(uid)
WRITE = with_user(uid, mutator)

3) Core migration started (no more "save the whole world")
• WebApp state endpoints = read-only (no setdefault + no saves)
• WebApp actions = with_user() only
• Telegram mission start/resolve is being moved into the same safe pattern

🎯 Result right now:
• Massive drop in rollback risk (no more silent overwrites)
• Progress stays consistent across Bot + WebApp
• If something unsafe still exists, it fails LOUD (easy to find + patch)

📌 Next cleanup (small remaining %):
• Convert any last legacy save_data() in TG modules (daily/teamup multi-user rewards)
• Add run_id/idempotency to spam-click actions (no double rewards)
• Final grep pass to confirm: WebApp = zero legacy saves

This wasn’t a fun content week… but it’s the upgrade that makes the game scale. Brick by brick 🧱🐺

Devlog #HOWLitsMade — Data Desync Fix (Root UID Ghost + WebApp Save Crash) ⚙️🐺

🛠️ This week was a real "systems over content" moment — the game looked like it was randomly wiping progress (lvl 1 / empty inventory), especially when more than 1 player was testing at the same time.

✅ What was happening (real cause):
• We had TWO user trees living at once: data[uid] (root) AND data['users'][uid] (schema2).
• Some modules were writing to the ROOT bucket while others were reading from users[].
• That created a ghost profile: one user could exist twice with different levels/items.
• In parallel requests, this caused overwrites + desync between Telegram and WebApp.

✅ Fixes shipped so far:
1) Unified user access with users_dict(data)
• Patched wallet.py and started replacing any data.setdefault(uid, ...) that created root UID ghosts.

2) Verified & repaired the "root vs users" mismatch
• Confirmed both references can point to the SAME object (no more split progress).
• Progress started loading correctly again (lvl / inv / stats are back).

3) WebApp write protection (anti-desync)
• save_data() is now hard-disabled inside webapp_dashboard.py on purpose.
• Any leftover save_data(data) calls inside WebApp handlers crash instantly → this exposed every unsafe endpoint.

4) Started the SAVE_DATA PURGE
• The WebApp is being migrated to a clean rule:
READ = read_user(uid)
WRITE = with_user(uid, mutator)
• This prevents race conditions + makes writes atomic and consistent.

5) Fixed Telegram WebApp restriction crash
• Dashboard button (WebApp keyboard) can only be used in private chats.
• Patch added: in groups it now sends a safe "Open Dashboard in DM" link instead of hard-failing.

📌 What’s still in progress (next):
• Purge remaining save_data(data) calls from webapp_dashboard.py (many endpoints still contain legacy saves).
• Patch Building flows (start/resolve), Moon Lab Fortress menu/start, Quests, Daily actions, Pets, Shop, Referrals.
• Make sure ALL WebApp actions follow the same pipeline and never create/overwrite ghost users.

🎯 Result so far:
• Player progress started showing correctly again (no more fake lvl 1 ghost profile).
• The system now clearly reveals any unsafe save paths instead of silently corrupting data.

Pack update: This is the kind of boring fix that makes the whole game 10x stronger long-term. Brick by brick 🧱🐺

Devlog #HOWLitsMade — Shop Item Inspect + Stat Compare (Buy With Confidence)

🛒 Shop Inspect (WebApp): added a new item details preview when you tap an item in the Shop — so you can actually judge if it’s worth buying.
🧩 Full Item Card: shows rarity/slot/price + description and quick stat chips for fast readability.
📊 Compare vs Equipped: the inspect view includes a clean NEW vs EQ comparison table with a Δ column, so you instantly see what you gain (or lose) before spending.
🧭 Navigation-Friendly: the inspect modal follows the new stack-based navigation rules — Back/Close behaves predictably and never breaks your flow.
✅ Goal: reduce “blind buys” and make progression feel smarter and more fair for players.

Devlog #HOWLitsMade — WebApp Navigation Stabilization + Active Pet Picker + UI Focus

🧭 Navigation Fix (WebApp): introduced a single, deterministic navigation flow with ONE global HOME (goHome) and a BackButton router.
🔁 BackButton Router: replaced the old BackButton behavior (closing the WebApp instantly) with a proper stack-based handler — Back now closes the topmost open modal/sheet first, and only closes the WebApp when nothing is open.
🧱 Nav Stack Consistency: added safe stack clearing on goHome() to prevent “ghost” back states after returning to the map.
🌐 Global Helpers for Modules: exposed nav helpers globally (window.navOpen/navClose/navCloseTop) so standalone modules (like quests.js) can use the same navigation rules without scope errors.
🐾 Active Pet Picker (MyPets): aligned the pets flow with an explicit “set active pet” picker in the WebApp — a dedicated MyPets entrypoint is now wired as the canonical way to choose your active pet during gameplay.
🎯 Community-Driven Direction: next work sessions will focus primarily on UI/navigation polish (clarity, flow, fewer clicks, stronger wayfinding) based on the community’s feedback — making the product feel smooth before pushing further content.

Devlog #HOWLitsMade — Pet Arena Replay Patch B (MP4 Render + Background Task)

🎬 Pet Arena Replay Patch B: switched replay delivery to a single MP4 video generated from battle frames (PNG ➜ ffmpeg ➜ H.264 MP4) instead of sending multiple assets.
⚙️ Background Render Job: replay generation now runs as a non-blocking background task — the callback immediately responds with a "Rendering replay…" message and the video arrives when ready.
🛡️ Per-User Task Guard: added a uid→Task lock so the same player can’t accidentally start two renders at once (prevents duplicate load + spam).
🧹 Guaranteed Cleanup: implemented strict try/finally cleanup for both frame directories and MP4 output folders under /tmp (no orphaned temp files).
⏳ Telegram Flood Safety: wrapped send_video with RetryAfter handling to respect Telegram rate limits and avoid failed sends during peak usage.
🧩 Compatibility Hardening: added tolerant field mapping for steps (HP keys, actor side detection) and a safer renderer init path to reduce edge-case failures across battle payload variants.
🎯 Why It Matters: replays are now lighter, cleaner, and more scalable — faster delivery, fewer messages, and safer server behavior as Arena usage ramps up.

Devlog #HOWLitsMade — Pet Arena Polish + Set Bonus Pass + WebApp “What’s New”

🐾 Pet Arena Stability Pass: continued tightening Arena behavior and fixing edge cases so battles, replays, and pet effects feel consistent.
🧬 Set Bonuses WIP: started consolidating how set bonuses are applied so stats remain predictable across modes (no hidden stacking / no desync between views).
🧪 Consumables Effects Fix: corrected consumable effect application so buffs/debuffs reliably trigger and persist through the intended flow.
🛒 Shop Consistency & Tuning: another balancing and cleanup pass to keep pricing, rotations, and rewards aligned with the ledger-first economy direction.
📰 WebApp “What’s New” Integration: connected the site’s updates feed to the WebApp — users now get an in-app updates modal with a NEW indicator, per-user read state, and direct links back to the devlog for full details.
🎯 Why It Matters: this is core hardening work — the boring fixes that prevent economy exploits, UI mismatches, and combat confusion as we scale toward TGE readiness.

Devlog #HOWLitsMade — WebApp Referrals + Forge Ledger-First Core

🧲 WebApp Referrals (Recruit & Earn): added the missing referral flow directly inside the dashboard, so the pack can share invites and track progress in-app.
⚙️ Forge Ledger-First Upgrade: moved Forge actions to a single source of truth — costs and rewards now go through the ledger to prevent desync and economy exploits before TGE.
🎲 Shard Pity Unified: standardized shard crafting pity into one canonical tracker (shard_pity) with auto-migration and a pityMap returned to the UI for clear state visibility.
🌑 Background Refresh: shipped a new WebApp ambience layer to make the hub feel more alive while we keep porting core loops into the UI.
🎯 Why It Matters: this is TGE hardening work — referrals and Forge are now closer to production-grade reliability and ready for full end-to-end testing.

Devlog #HOWLitsMade — Character & Equipped Panel (WebApp)

🧍 Character & Equipped Panel: shipped the first working version of the character view inside the WebApp — avatar preview + equipped slots.
🧩 Equipped Module: split into a dedicated equipped.js flow that talks to /webapp/equipped/* endpoints and renders the character PNG with gear overlays.
🗺️ UI Navigation Step-Up: the dashboard is evolving from text commands into a true hub — more actions are now reachable as buttons/modals instead of chat-only.
🎯 Why It Matters: this is the bridge between the game’s core economy and a clean, modern UI — a key step before token utility goes live.

Devlog #HOWLitsMade — Moon Lab Fortress Combat Parity (Stats & HP)

🧪 Fortress Combat Parity: unified the combat pipeline so every mode reads from the same stats source (base + gear + pet).
❤️ HP Consistency Pass: standardized player max HP calculation (HP = 50 + 12*VIT) to eliminate edge cases where the WebApp/boss fight could show incorrect HP.
📜 Cleaner Battle Logs: improved the clarity of combat outputs so totals reflect what the player actually has equipped.
🎯 Why It Matters: stability beats hype — combat parity across systems is mandatory before scaling the economy into TGE territory.

Devlog #HOWLitsMade — Mission Board MVP + Fortress Integration

📋 Mission Board MVP: brought the Quest/Mission Board into the WebApp with a real UI (filters, states, actions) backed by /webapp/quests endpoints.
🧠 Quest Hooks Everywhere: prepared hooks so victories and key actions reliably push quest progress across missions and building runs.
🏰 Moon Lab Fortress Wired: integrated Fortress state/start flows into the WebApp router, including cooldown handling and save protection.
🎯 Why It Matters: quests are the long-term progression spine — moving them into the WebApp makes the experience feel like a real game hub, not just a bot menu.

Devlog #HOWLitsMade — Pet Archetypes & RPS Arena

🐾 Full Pet Stat Pass: defined BASE_STATS for all existing pets — not only adoptable companions, but also evolutions, exclusives and event pets. Every pet now has clear STR/AGI/LUCK/VIT/DEF values instead of relying on loose defaults.
🔺 Feral / Trickster / Mystic Archetypes: grouped every pet into one of three arena archetypes (feral, trickster, mystic), including hidden and token-only pets. Each archetype has at least one easily accessible pet, so new players can pick a style instead of being locked into one meta.
🎮 Rock–Paper–Scissors Layer in Pet Arena: wired a light RPS system into Pet Arena — Feral beats Trickster, Trickster beats Mystic, Mystic beats Feral. The winner archetype gets a small stat boost, the weaker one a small debuff, before the normal combat simulation runs.
⚖️ Less RNG, More Meaningful Choices: fights between similar-level pets are no longer pure coin flips. Archetype matchups matter, but RNG and progression still play a big role, keeping battles exciting instead of deterministic.
🧱 Why It Matters: this update turns Pet Arena from a fun prototype into a more deliberate system — pet choice, progression and matchups all matter, and the backend is ready for future pet content, skills and token-linked rewards.

Devlog #HOWLitsMade — Quest Engine, AFK Lock, Pet Bonds

📜 Quest Engine Clean-Up: reworked the quest backend so story, daily and repeatable quests are now clearly separated, easier to tune and safer for long-term balance. XP rewards were normalized (with a soft cap for regular tasks) so progress feels steady instead of spiky.
🧭 Lore-Driven Story Quests: expanded the STORY category with new lore quests and pet milestones (pet level 10 and 20), tying progression directly into the Alpha Husky saga instead of generic “do X times Y” objectives.
🧩 Backend Wiring for Quests: hooked quest progress into multiple systems — missions, shop, main loop, fortress and WebApp — so actions across the game reliably emit quest events and contribute to the right tasks without hidden side paths.
⛓️ AFK Chain Gate Lock & Claim: tightened the AFK system by adding a proper lock — when your avatar is on AFK duty at the Chain Gate, they can’t start other building runs, and rewards are now claimed manually via a dedicated resolve action instead of silently in the background.
🔄 Unified AFK State Machine: integrated AFK state (idle → running → ready → claimed) into the WebApp + bot handlers, ensuring that timers, rewards and locks stay in sync and are easier to reason about before TGE.
🐾 Pet Arena Evolution: refined pet XP and level-up logic so skills unlock cleanly and both daily-style progress (pet_level_up) and story milestones (pet_level_reached) are tracked consistently across feeding, arena battles and future pet content.
🎯 Why It Matters: this update doesn’t scream with new buttons, but it hardens the spine of the game — quests, AFK and pets now behave more like a production-grade system than a prototype, which is exactly the kind of stability we need before putting a real token on top.

Devlog #HOWLitsMade — WebApp HUD, Player Card, Chain Gate AFK

🧩 Cleaner WebApp Layout: rebalanced the main dashboard and map view so key actions, stats and buttons are easier to see at a glance, with less clutter and more readable spacing on both desktop and mobile.
🖼️ Central Player Card: added a new hero panel in the middle of the dashboard that shows your Husky skin artwork, nickname and real in-game level pulled from the backend, so every login feels like stepping back into your own character rather than a generic menu.
🎭 Skins Ready for Future Utility: wired the skin slot into a dedicated frame and DOM IDs, making it straightforward to later plug in dynamic skins, rarity frames and event cosmetics without reshaping the whole layout again.
⏳ Chain Gate AFK Mode: turned Chain Gate into a proper utility building by giving it an AFK loop — you send your Husky on an AFK run, let the timer tick in the background and then claim rewards directly via the WebApp through a dedicated claim action.
🦴 AFK State Tracking: backend now stores per-player AFK state (idle → running → ready) and safely resets progress once rewards are collected, so AFK gains are trackable, fair and easy to tune.
🎯 Why It Matters: this update makes the WebApp feel more like a real character hub and less like a prototype UI, while introducing AFK progression as a new pillar of the core loop — even when you are offline, the Pack keeps moving and your Husky does not stand still.

Devlog #HOWLitsMade — Ledger Spine, Shop Anti-Farm, Inspect HUD

📒 Ledger Sanity & Admin View: wired an admin-only /verify_ledger and /ledger_show on top of ledger_lite — admins can now run signature checks across the full log, see per-user balances, and inspect the last entries directly in Telegram, making the ledger the single source of truth for Season 0 rewards.
♻️ Auto-Dupe 2.0: refined add_item_autodupe and auto_dupe_cleanup so excess gear copies are safely auto-salvaged into Scrap and Rune Dust, respect backpack capacity and locked items, and write a single aggregated materials grant to the ledger while tracking how many items were auto-salvaged per player.
🛡️ Shop Anti-Farm Limits: introduced per-item daily limits for the Daily Shop (with a global default and optional daily_limit overrides in all_items.json). Both /buy and inline buy_... buttons now share a unified check backed by per-user shop_limits, so key consumables and utility items cannot be spam-farmed in a single day.
🧬 Referrals → Ledger Wiring: the existing invite flow now appends a referral_bonus entry to the ledger whenever a referrer is rewarded (within the 5-per-day cap), with ref metadata (type=referral, from=referrer_id, to=new_howler_id). Badge thresholds were updated so ECHO_HOWLER now unlocks at 5 invites and SIGNAL_CALLER at 8, while ALPHA_HERALD and PACK_SUMMONER remain the higher milestones.
🪙 Inspect HUD with Live Materials: unified the inspect view for equipped and inventory items into a single _render_inspect_card_inplace that shows current stats, Next★ preview, Max★ projection (including HP gain from VIT) and a live ledger-based readout of the player’s Scrap, Rune Dust and Bones vs the upgrade cost, so every Howler instantly sees if they can afford the next forge.
🎯 Why It Matters: today’s work hardens the backbone for TGE — referrals, shop, forge and future Season 0 snapshots all read from the same append-only ledger, and the in-game UI finally reflects those true balances, making progression and rewards transparent, auditable and much harder to game.

Devlog #HOWLitsMade — Referral Spine, WebApp start_param, Admin Audit

🧬 Referral Spine E2E: locked `ref_` as the canonical invite prefix and wired it into /referral — each player now gets both a classic bot link and a Mini App link that feed into the same tracking path.
🌐 WebApp start_param Wiring: the WebApp state endpoint now reads start_param=ref_<id> from Telegram init_data, sets invited_by once, applies the 5-per-day referral reward cap, and grants the four referral badges at their thresholds (ECHO_HOWLER, SIGNAL_CALLER, ALPHA_HERALD, PACK_SUMMONER).
📣 Player Referral Panel: refstats was cleaned up into a proper referral dashboard — it shows who invited you (if tracked), total rewarded invites, today’s progress out of 5, and referral-only badges instead of dumping every achievement you’ve ever earned.
📊 Admin Referral Audit: shipped ref_audit as an admin-only overview that reports how many users have an inviter tracked and ranks referrers by rewarded invites; fixed the ADMIN_IDS string/int mismatch so all admin checks behave consistently across commands.
🎯 Why It Matters: referrals are now a reliable Season 0 signal — every valid invite is tracked and capped fairly, whether a new Howler lands through the bot or directly in the Mini App, laying groundwork for pre-TGE contribution recognition.

Devlog #HOWLitsMade — Equipment Guard, Single-Buff Policy, Inventory UX, WebApp FAQ

🔧 Equipment Upgrade Guard: enforced per-item star cap (star_cap) server-side and in the inspect refresher — the Upgrade button now switches to “At cap” immediately. No overshoot; costs/preview only when below cap.
🧪 Single Timed-Buff Policy: only one timed consumable buff can be active at a time (xp_gain 30m, cooldown_reduction 15m, alpha_surge 30m, generic boost 24h). Central lock (buff_lock_until) with user message showing remaining time. Both /use and inline ‘Use’ respect the lock. One-offs (dice_luck, double_feed, plushie_protect, mission_speed_next) are unaffected.
🎒 Inventory & Use Handlers: aligned /use and inline callback behavior; normalized “consumable”→“special” alias; consistent achievements + save flow. Cleaned indentation (tabs→spaces) to remove a runtime IndentationError.
🖼️ Inspect Card UX: refresh now respects per-item cap instantly (shows Stars bar and disabled state), preserves cost & stat-preview when upgrade is available, and keeps Unequip/Back actions in place.
❓ WebApp FAQ (v0): added faq.js module and wiring; seeded Quick Start, How to begin, and Core Loop entries; content is scaffolded for fast iteration.

Devlog #HOWLitsMade — Purge, HP Parity, Shard Fix, Adoption Center, Forge→Shards

🧹 Purge Day: world reset shipped — fresh inventories, clean stats, equal chances for newcomers.\n💙 One Source of Truth (HP/Stats): Missions now use the same pipeline as Moon Lab → compute_full_stats → player_from_totals → compute_player_max_hp (HP = 50 + 12×VIT). 1-HP edge cases removed; parity confirmed.\n🧩 Shards (ledger path): fixed a bug where Premium Box could overwrite shard balances — rewards now credit additively via ledger (no set/overwrite). Unified naming to <slot>_shards with a back-compat reader that sums (new + legacy).\n🧰 Migration: shipped one-off, idempotent script to merge legacy shard_<slot> → <slot>_shards in ledger and reconcile totals for affected users.\n🐾 Adoption Center: standalone pet adoption (separate from Daily Shop) with Bones-ledger payments and correct stat assignment/persist.\n🔥 Forge→Shards: craft flow live (RNG 80/20, pity 5, refine +2) with proper additive credits and UI feedback.\n📝 Builder’s Notes: added “Why Alpha Husky is Different” section (lean, proof-first).

Devlog #HOWLitsMade — Fortress fixes, Ledger hardening, Inventory & Pets

🏰 Fortress: fixed L1 loop & 1-HP bosses (HP from blueprint + safe min), reliable cooldown (cooldownUntil + legacy), no rollback on save, dynamic encounter count, gentle agility/crit scaling, turn_cap=60.
💰 Ledger: shop spends Bones via ledger; missions (auto-resolve, daily + RAID bonus) pay through ledger/tokens; pets evolve by spending tokens via ledger; inventory (boxes, salvage, bulk, auto-dupe, item “bones” rewards) credits via ledger with UI snapshot mirror.
🧰 Utils: save-time fortress_progress_guard prevents stale writes; minor polling stability tips documented.
🧩 Dev: universal credit/debit/tx shims added for consistent economy calls.

Devlog #HOWLitsMade — Missions→Ledger, Daily/RAID Flow, Gifts & Wallet Sync

⚔️ Missions now pay via Ledger-Lite (Bones/Scrap/Rune Dust/Shards) with a single apply; XP unchanged.
📅 Daily Quests: “Explore” completes after any mission resolve (win/lose). RAID daily completes after /raid <passcode> with DM fallback.
🛡️ Anti-abuse: tokens are granted at /end_raid (1 per raid per user), daily cap enforced, per-raid dedup; status and ranking live.
🎁 /gift: Bones transfer runs through ledger with a shared transfer_id (auditable), mirrored to UI; self-gift blocked.
📊 /materials & /profile: now read from ledger snapshot (Bones fixed); /skills formatting cleanup.

Devlog #HOWLitsMade — Ledger-Lite Core, Wallet Migration & Upgrade Sync

💾 Ledger-Lite = single source of truth for game wallets (Scrap, Rune Dust, Bones, Tokens). Snapshot (user.materials) mirrors ledger on read.
🛒 Shop & 🛠️ Upgrade now use the same flow: check → ledger_spend → mirror (no more points/materials decrements). Purchases and upgrades are fully auditable.
🪙 Tokens & 🦴 Bones helpers refactored: add/spend write to ledger; daily limits & history remain as telemetry (separate from wallet balance).
🧰 Admin toolbelt: /ledger_report_bones, /migrate_bones_all [force], /migrate_bones <uid>, /wallet_bones_set, /wallet_sync_bones_from_score, /grant, /bones_debug.
📦 Migration executed: 29 users credited, +4,663,469,484 Bones total (module=bootstrap). Wallets now match pre-reset balances.
🧪 Dev UI: /dev_me shows real ledger balances and Total Spent computed from ledger entries.
🔒 Guardrails: token spends for upgrades blocked in materials mode; zero-safe mirroring for known assets; CSV export fixed; double-tap locks on upgrades.
📣 Clarity: “Bone Score (lifetime)” (leaderboards) vs “Bones (wallet)” (spendable) distinguished across UI.

Devlog #HOWLitsMade — Mission Board MVP

🪧 Mission Board opens from Broken Contracts. Added high-contrast board styling.
🌐 Backend: /webapp/quests, /quest/accept, /quest/complete (MVP) wired; server boots clean.
🐍 quests.py: fixed setdefault bug; reward/grant logic cleaned; daily rotation stable.
⚔️ Missions: post-battle quest ticks prepared (auto/manual resolve).

Devlog #HOWLitsMade — Dojo, Legends in Gallery, Roadmap pass

🥋 Dojo (Testnet Wastes): shipped a zero-risk training ground. Front: new js/dojo.js modal with timer + live metrics (DPS, total, hits, avg/max, crit%). Map pin routes straight to Dojo; Start triggers /webapp/building/start (dojo), state returns last session. No materials lost, small mastery rewards planned.
🔌 Wiring: index loads js/dojo.js (cachebusted), Dojo.init shares apiPost with Fortress; map click handler and bot’s NODE_TO_BUILDING map now include testnet_wastes → testnet_wastes_dojo. Backend: dedicated dojo branches in /webapp/building/state and /webapp/building/start.
🖼️ Gallery: added two legend cards (Alpha Herod, Cherenkov Warden) with lightbox, lazy-load and proper alt text.
🗺️ Lore consistency: kept location name as “Testnet Wastes”; Dojo is a building/function inside that region, not a new region.
🧭 Roadmap: updated “Shipped” with Site/Gallery row, consolidated Shop/Admin telemetry, tightened wording on DoD. Kept WebApp action migration as “In progress”; clarified “Next” (bring back /daily; wire start/resolve for AW/BC; inventory cap → stash).
🐛 UX: fixed start/refresh flows in the building modal to reflect server timers reliably; added gentle haptics + clearer alerts.

Devlog #HOWLitsMade — Unified WebApp + Map/Buildings

✅ Unified paths: the split behavior between “Open Mini App” and “Open Dashboard” is gone — both now share one flow; Map and Daily Quests work consistently in both.
🔐 Auth: fixed Authorization header (Bearer init_data); backend strictly verifies Telegram init_data (HMAC) via _verify_init_data; set_bot_token logging confirms correct token.
🔁 Bridge: added /webapp/action to support dual transport (keyboard sendData ↔ HTTP + answerWebAppQuery) with identical payloads.
🗺️ Map & Buildings: front handles node entry + in-app modal (Start/Resolve) with auto-resolve and reward alert; Abandoned Wallets Vault and Broken Contracts Hub are wired; Moon Lab (moonlab_fortress) remains bot-handled.
🧭 map.json is the source of truth: nodes = chain_gate, abandoned_wallets, broken_contracts, moon_lab, testnet_wastes; defaults → chain, moon_lab unlocked; testnet_wastes locked.
🧩 Daily Quests: /webapp/daily/state and /webapp/daily/action unified — Claim/RAID works in Mini App and Dashboard.
🛡️ Hardening: strict JSON shapes & HTTP codes, rapid-click guards, tiny debug badge (status/error), tightened CORS to app.alphahusky.win (+ preview).
🔗 Entry policy: one way in — Telegram WebApp via WebAppInfo or short_name link; avoid bare URLs. Short name: AlphaHuskyHub.

Devlog #HOWLitsMade — BAD_HASH fix + WebApp Map/Buildings

✅ BAD_HASH: root cause fixed — WebApp now consistently launches under @Alpha_husky_bot; backend verifies Telegram init_data (HMAC) and rejects bad signatures; [AUTH] logs show set_bot_token OK.
🗺️ WebApp Map: pins, paths & glow; label-collision fixes; Region Sheet; Locked modal; unlock progress counter (fragments → key); particle-burst click effect.
🏗️ Buildings (HTTP): new endpoints /webapp/building/state, /webapp/building/start, /webapp/building/resolve + in-app modal (“Refresh/Start/Resolve”) — works for Abandoned Wallets Vault; Moon Lab (moonlab_fortress) stays bot-handled for now.
🧩 Daily Quests: WebApp-first — /webapp/daily/state and /webapp/daily/action wired to the list with Claim/RAID buttons.
🎨 Contrast & theme: no more black-on-black; automatic colors from Telegram theme with safe fallbacks; topbar shows LVL/Bones.
🛡️ UI hardening: global try/catch, tiny debug badge (status/error), rapid-click guards, consistent JSON shapes & HTTP codes, strict CORS allow-list.
🗺️ map.json: remains the source of truth for pins/regions; note: Moon Lab pin uses action=building_enter → buildingId=moonlab_fortress (not in BUILDING_CFG yet by design), so it routes to the bot.

Devlog #HOWLitsMade — API Hardening + Tunnel Complete

🌐 Cloudflare Tunnel locked in — api.alphahusky.win now terminates HTTPS and forwards to the private backend on 127.0.0.1:8081 (no public ports exposed).
🔐 Security: Correct Telegram init_data verification (HMAC/WebAppData) with 24h freshness + strict CORS allow-list for production origin, with optional dev toggles (DEV_OPEN_CORS, DEV_NO_VERIFY) for safe diagnostics.
🛎️ API surface: /health, /dbg/ping, /webapp/state, /webapp/daily/state, /webapp/daily/action — consistent JSON shapes & status codes for easier client integrations.
🧭 Observability: clear structured logs ([CORS], [AUTH], [DAILY_*]) and boot banner with active flags → faster triage.
🧪 Testing: ready cURL snippets for health, CORS preflight and payload endpoints.
🗺️ Roadmap (next): persist user stats/quests in storage, hook daily_raid completion to bot events, add basic metrics (DAU, bones/day), smoke tests in deploy, per-env config & feature flags, versioned API.

Devlog #HOWLitsMade — Cloudflare Tunnel + Stable API Domain

☁️ Backend now runs behind a Cloudflare Tunnel — our IPv6-only VPS is reachable from both IPv4 & IPv6 with automatic HTTPS.
🔒 Safer exposure — traffic goes through Cloudflare; the origin stays behind the tunnel (no public inbound port needed).
🌉 Stable API domain — WebApp targets https://api.alphahusky.win, paving the way for new features and smoother deploys.
🗺️ Roadmap — work in progress; more details soon. We’ll keep posting updates on the site.

Devlog #HOWLitsMade — All-Unlock Map + Moon Lab (WIP) + WebApp Bridge

🔓 Map All-Unlock — temporarily all regions and buildings are open for everyone (no keys/fragments).
⚔️ Moon Lab: Fortress — **under construction (WIP)**. Menu is available from the map; boss fight prototype behind a toggle (1h CD). Progression/rewards are subject to change.
🌀 Lightweight battle animation (WebApp) — HP bars, hits/CRIT, VICTORY/DEFEAT, Replay; steps delivered via /webapp/state (lastBattle). Zero extra bot load.
🧩 WebApp Bridge — new on_webapp_data understands JSON and short "a:b:c"; handles building_enter, region_open, cmd. No more “Unsupported WebApp action”.
🗺️ map.json (front) — defaults set to unlocked; Moon Lab & Testnet Wastes use unlock: free; paths render without locks.
🎯 Explore/Hunt mapping — Exploration → Abandoned Wallets (abandoned_wallets_vault), Hunt → Broken Contracts (broken_contracts_hub).
🔧 Stability — WebApp handler runs first (group=-1, block=True); fixed WEBAPP_BASE (no trailing slash); lazy-imported Moon Lab menu (fixes NameError).
🛠️ Dev switch — UNLOCK_ALL=1 active; turn off with UNLOCK_ALL=0.

How to test: Open App → Map → Moon Lab → “⚔️ Fight Boss (prototype)”. Abandoned/Broken → “Enter” starts a run.

Devlog #HOWLitsMade — Keys migration + Consumables shop

🧩 Universal Key Shards — added a self-serve migration in /keys. If you have old “Map Fragment(s)”, you’ll see a Migrate old fragments → Universal button. Migration is idempotent and supports legacy names.
🔑 /keys panel upgrade — shows Universal shards and new inline actions: per-region +1 / +5 / MAX and ⚖️ Split ALL evenly. Craft & Unlock uses KEY_RECIPES (dynamic needs).
🛒 Shop: Daily Consumables — rotation enabled (auto-refresh). handle_buy updated to support consumables cleanly.
🧰 Admin tools — bulk prep/migration for legacy holders; test seeding for QA.
🔗 QoL — /forge shortcut opens the /keys panel; minor inline UI polish.

How to use: farm shards → open /keys → (if you have legacy, hit Migrate) → convert Universal → Craft Key → Unlock regions. Consumables are in the shop’s daily rotation.

Alpha Update — quick TL;DR

🗺️ New WebApp Map — click buildings; the old image-map is retired.
🧪 Moon Lab: Fortress — multi-floor boss gauntlet, rising difficulty, 1h cooldown, rare drops.
🧠 41 new Daily Quiz questions.
🔹 Missions → Key Shards — missions now drop region key shards (with a pity every 10 wins).
🔑 /keys & /forge — craft keys from shards and Unlock regions (inline buttons).
ℹ️ “How to get keys?” — helpful popup (no cooldown toast).

How to play: Open App → Map → try Moon Lab • farm shards in missions • /keys or /forge → Craft Key → Unlock new regions. 🚀

Event Banner + Countdown — Blood Moon prep & front-end polish

Today we focused on the front-end to make the game experience smoother and to prep for the Blood Moon eclipse. Added an event banner to the homepage with a D-3→start countdown, light glitch pulse on digits, mobile/desktop responsive picture, dismiss button (localStorage), and auto-expire after the event window. Also tightened WebApp entry points and minor UI polish (lazy videos + IntersectionObserver). Worth checking the site daily — the banner flips to LIVE coverage during the eclipse.

WebApp Bridge v1 — Clickable UI → Bot + Fallback

We launched the WebApp → bot bridge: buttons in the WebApp now trigger bot actions (Mission, Inventory, Equipped, Keys, Feed, MyStats, MyPets, Profile, Howlboard, Shop, Map). Added a robust web_app_data handler + sniffer, a global menu button, /app_* commands, and the webapp_kb helper. Brought up a minimal /webapp/state API (aiohttp:8081). Enabled DEBUG logging and installed aiohttp. Fixed mission_open → mission mapping. Rollback-ready: /dashboard works as the classic text view if needed. The map modal wires up Ask the Bot / Forge / Shop.

Forge Week D6 — Region Keys + Moon Lab

Region Keys meta is live: collect Map Key Fragments and craft region keys in Forge (Moon Lab: 10, Testnet Wastes: 15). Unified gates in Bot + WebApp: /keys shows status and Unlock; map modal shows requirements. Moon Lab fortress online (3 floors × 10 encounters, 1h cooldown, persistent progress). WebApp gains clickable commands (Mission, Inventory, Equipped, Keys, Feed, MyStats, MyPets, Profile, Howlboard, Shop, Map). Consumables rotation hooks ready (SKU e.g. moon_frag_pack).

Forge Week D4–D5 — DONE

Wrap-up: materials-only upgrades are fully enforced (token path hard-blocked), Reforge (5/day) and Fuse (8/day) live, ★5 cap active. Inspect/Upgrade/Unequip routing fixed (slot whitelist); inventory Inspect now stable with text fallback while assets are added. Telemetry enabled for dev (materials_spent by reason, first ★5 timestamp). Monitoring remains on, but D4–D5 are considered complete.

Forge Week D4–D5 — Legacy Token Upgrade Hotfix & Root Cause

Symptom: some upgrades still deducted tokens despite materials mode. Root cause: UPGRADE_COST_MODEL was imported at module load (stale value cached) and a legacy `else: spend_tokens(...)` path still existed; a second handler might also have been catching `^upgrade_`.

Fixes applied: 1) Removed module-level import of UPGRADE_COST_MODEL; the mode is now read dynamically inside the handler. 2) Added a hard guard in the upgrade handler to enforce materials-only during Forge Week; legacy branch disabled. 3) Normalized config/env to strict 'materials'. 4) Atomic materials deduction before stat changes; int-safe helpers. 5) Anti double-tap lock around upgrade. 6) Process restart to refresh config.

Diagnostics & safety: temporary breaker available in spend_tokens() to raise if materials mode is active (to reveal stray call-sites). Repo grep planned for any extra `CallbackQueryHandler(..., pattern="^upgrade_")` and `spend_tokens(` references.

State: materials upgrades verified in smoke tests (no 'Spent X tokens' logs), reforge/fuse limits remain green, backpack cap OK. Monitoring continues while we clean up any legacy handlers. Next: enable telemetry (materials_spent + star5_at) and add /dev_star5 + /dev_costmodel.

Forge Week Day 5 — Materials Upgrades, Reforge & Fuse (daily limits)

Big step for the Forge. 1) Upgrades now run on materials: Scrap + Bones (+Rune Dust from ★3), with a hard cap at ★5 and a config toggle to fall back to tokens if needed. Costs tuned upward for meaningful late-game progress. 2) Reforge is live as a daily-limited reroll (Bones + Dust by rarity), preserving total potency while shifting stat lines; limit = 5/day, resets 00:00 UTC. 3) Fuse burns duplicates by slot+rarity and grants Selector Shards toward crafting higher tiers; limit = 8/day (Bones/Dust cost by tier). 4) UI parity: both equipment and inventory ‘inspect’ now show material costs and route the same Upgrade action. 5) Glue/handlers wired; legacy token text removed to avoid confusion. Note: to minimize player impact, we will run a focused test window tomorrow morning and adjust rollout if anything unexpected appears.

Forge Week Day 4 — Backpack Cap + Cap-aware Auto-Dupe (no Loadout/Stash)

Clean and simple progression. 1) Backpack cap is live (default 30): only gear counts; locked items are excluded when BACKPACK_COUNT_LOCKED=false. 2) Auto-Dupe now respects the cap — when full, extra gear instantly converts into Scrap (and sometimes Rune Dust); non-gear never counts. 3) Start-mission alert warns when your backpack is full; missions still run, and excess drops auto-salvage. 4) Safety pass: a gear-only filter powers bulk/clean to ensure consumables/boxes/tokens are never affected. No Loadout, no Stash — by design, to keep UX lean. Next: Day 4–5 — Upgrade/Reforge/Fuse on materials with daily limits.

Forge Week Day 3 — Salvage, Bulk & Auto-Dupe + Forge Clean (admin) 🎉🐶

We shipped the inventory quality-of-life trio and closed D2–D3. 1) New player commands: /lock, /unlock, /locks, /salvage <item> [qty], /bulk_dismantle rarity=... keep=... — safe cleanup with locked items always skipped. 2) Auto-Dupe: excess copies now auto-salvage into Scrap (and sometimes Rune Dust) using per-rarity limits (common/uncommon=3, rare=2, epic/legendary=1). 3) Admin /forge_clean_user: one-time tester cleanup that keeps ≥1 per item key (and equipped), skips locked, grants Veteran Salvager badge + small shard cache, and reports materials gained. 4) Hotfix: bulk & clean now affect gear only (consumables/boxes/tokens remain untouched). Next: Day 4–5 — Upgrade/Reforge/Fuse on materials with daily limits. Happy International Dog Day to the whole pack! 🐾

Forge Week Day 2 — Loot Patch (Solo/Co-op/Boxes) + Lore Ch.2 + Website refresh

Forge Week continues. 1) Swapped ALL core loot sources to the new economy: solo missions, TeamUp (co-op) stages, and boxes now grant Bones, Scrap Alloy, Rune Dust, and Selector Shards (no full gear) while ENABLE_FULL_GEAR_DROPS=false; rare boss/event drops remain a separate toggle. 2) Unified helpers and removed ‘Bones’ from materials storage to prevent desync (Bones remain from points). 3) /materials + HUD stay aligned with the new counts. Also today: Chapter 2 of the lore premiered, and we refreshed several sections of the website with cleaner layouts and a mobile-friendly pass (navigation, spacing, typography). Next: Salvage (manual/bulk/auto-dupe) and the one-time Forge Clean.

Profile Card Badges live + 2,200 milestone

Profile cards now render real badge PNGs. We filtered /setbadges to true BADGES keys, added a robust icon resolver (absolute assets/badges paths, slug + icon_file support), and sanitized markup to avoid parse errors. Result: the bottom row shows selected badges instead of placeholders (with +N overflow). Milestone: we crossed 2,200 followers on X — thank you, pack!

Forge Week Day 1 — Materials & Shards foundation

Laid the economy groundwork. 1) Data migration complete: every player now has materials.scrap and materials.rune_dust plus a per-slot shards dictionary (weapon/armor/fangs/cloak/collar/helmet/ring/offhand/gloves). Pet is excluded from shards. The script created an automatic backup before saving. 2) Config set: SELECTOR_SHARD_SLOTS updated (no pet), SHARDS_REQUIRED_UNCOMMON=10, and a materials-only drop table scaffolded; ENABLE_FULL_GEAR_DROPS is prepared for the switch. 3) New /materials command is live — shows Scrap, Rune Dust, and Shards; Bones are intentionally not shown here to avoid desync (Bones remain governed by core balance). 4) Art for Scrap Alloy and Rune Dust is ready. Next: swap mission/box loot to materials+shards and ship salvage (manual, bulk, auto-dupe) with the one-time Forge Clean.

Effects live, boxes refined, gameplay hooks wired

Big systems pass today. 1) Effects are live in gameplay: dispatcher now treats effect.type='consumable' as special → all registered effects fire. New/updated handlers: xp_gain (+25%/30m), dice_luck (next roll boost), cooldown_reduction (−50%/15m), double_feed (2 uses), plushie_protect (fail shield x1), alpha_surge (+20% XP/loot/bones/30m), boost_next_mission_speed (next mission ×0.5 duration), bone_pack_lottery (10–2000 bones). 2) Items: Moonstone Orb now grants +30 pet XP once per UTC day (no level-up); Cosmic Seed intentionally unknown (for future event); Energy Drink uses the next-mission speed boost. 3) Boxes: Mystery now pulls ONLY consumables and excludes other boxes (no box-in-box); Premium rolls random gear; Legendary prefers unique pet/skin tokens, otherwise legendary+ gear (fallback to epic+); alias random_shop_reward→random_reward. 4) Feed/Dice/Missions are wired into hooks: feed uses adjust_cooldown/apply_xp_bonus/apply_bones_bonus/apply_feed_xp_bonus (Turbo Bone can bypass CD by consuming a use; Lucky Coin auto-consumes on next feed); Lucky Dice uses adjust_cooldown and apply_dice_bonus (then scales wins via apply_bones_bonus); Missions: on start, duration respects cooldown reduction and consumes the next-mission speed boost; on resolve, XP/Bones pass through effect multipliers and Plushie saves on fail; loot_table reads user_data; token drop chance kept with daily cap. 5) Inventory/UX: stricter gear detection (unknown items no longer show as gear); migration aliases added (e.g., standard_box→mystery_box, booster_xp→xp_surge, encrypted_chip→decrypt_datapad, firebone→turbo_bone, ice_crystal→icecrystal).

Consumables rework + Mystery/Premium/Legendary Boxes

Finished the consumables pass and wired effects into gameplay hooks. New/updated items: XP Surge (+25%/30m), Chaos Dice (+25% next roll), Speed Boost (-50% cooldowns/15m), Turbo Bone (double feed), Husky Plushie (fail protection x1), Alpha Surge (+20% XP/loot/bones/30m), Lucky Coin (2× XP next feed), Energy Drink (next mission 2× faster). Added Bones bonus + mission duration helpers. Loot boxes shipped: Mystery Box (consumables-only pool), Premium Box (random gear), Legendary Box (legendary gear + support for unique pet/skin tokens). Bone Pack converted to a lottery (10–2000 bones; shop price 1000).

Badges revamp + Daily Howl streaks (7 & 30) + unified stats

Shipped tiered Bug Hunter badges (5/15/25), Howl Streak badges (7 & 30 days), single-tier Never Lucky, unified stat pipeline across /mystats, /stats and upgrades, admin-only /accept_bug, idempotent /dailyhowl; plus multiple fixes.

Site Launch + Skins Gallery MVP

We launched the public site and the first version of the supporter cosmetics gallery. MP4 clips autoplay when visible and pause off-screen. More cosmetics, posters, and UI polish coming next.

Further into the archive