Development Log
This devlog documents the ongoing development of WebDevEmpire.
Entries cover design decisions, system changes, balance updates, and technical
challenges encountered while building the game.
The project is developed as a hobby and learning exercise. Features are added
iteratively, and older systems are frequently revisited as new mechanics are
introduced.
A dedicated Settings page (/settings) was added to the
sidebar navigation, consolidating all player-configurable options in one place. Display
settings (number locale, compact notation) and game-loop tick rate were moved here from
the Save page. The performance debug overlay toggle is also surfaced here when running
on localhost.
A new Sound system was wired in via SoundService and a
lightweight JS bridge (sfx.js). Clicking the Frontend or Backend buttons
on the Dashboard now plays a short click sound, with distinct WAV files for each side
and retro variants available. Four independent volume channels-Master, SFX, Music, and
Notifications-can be adjusted individually or muted entirely. All sound preferences are
persisted in the save file and restored on load.
A performance pass cleaned up rendering across eight pages (Achievements, Dashboard,
Developers, Equipment, Infra, Upgrades, Prestige, Offices), removing redundant
tick-subscriptions and tightening dirty-flag logic. A subscription-leak bug in the
Dashboard's Dispose() method (OnTick += β¦ instead of
OnTick -= β¦) was also corrected.
- New Settings page: sound controls, game-loop tick rate, display format, debug overlay
- SoundService: Master / SFX / Music / Notification channels with mute-all toggle
- Click SFX on FE and BE buttons (WAV files)
- Ambien music (WAV files)
- Sound preferences saved and restored per save profile
- Rendering performance pass across 8 pages - reduced unnecessary re-renders
- Fixed OnTick subscription leak in Dashboard Dispose()
The biggest UI pass yet brings mobile-responsive layout to the game.
The old "Desktop Recommended" gate popup was removed and replaced with a proper
hamburger menu and slide-out sidebar with backdrop overlay. HUD items in the top bar
now collapse progressively at different breakpoints so the most important stats stay
visible on smaller screens. The sidebar auto-closes on navigation for a smoother
mobile flow.
New players now see progressive onboarding banners on the Dashboard
that guide them through the first few minutes: clicking for DP, completing their first
module, hiring developers, and understanding bugs. Each step only appears when it's
contextually relevant and disappears once the player has progressed past it.
The event system received a major visual upgrade. Active event cards
on the Dashboard now show typed icons, effect badges (buff/debuff for income, DPS, and
instant money), and an animated progress bar showing remaining duration. A new
EventToast component displays a global slide-in notification whenever an
event fires, so players are always aware of events regardless of which page they're on.
The Upgrades page now shows a calculated effect summary for each
upgrade - both the projected value before purchase and the current total after purchase
- so players can make informed decisions without mental math.
On the technical side, a new design-tokens.css file centralises the
colour palette and spacing variables. Thread-safety was improved in
GameStateService (DP mutation lock) and LocalStorageSaveService
(scheduler lock) to prevent race conditions between UI clicks and the background
game loop.
- Mobile-responsive layout: hamburger menu, collapsible sidebar with overlay, progressive HUD hiding
- Progressive onboarding banners on Dashboard for new players (3 contextual steps)
- Event cards redesigned: typed icons, buff/debuff badges, animated progress bars
- EventToast: global slide-in notification on event trigger
- Upgrade effect summaries: projected and current values for all upgrade types
- Centralised design tokens CSS file linked from App.razor
- Thread-safety:
_dpLock in GameStateService, _schedulerLock in LocalStorageSaveService
- CSS refresh across all pages using new design token variables
The NumberFormatService introduced in the previous UX pass was only wired
into a handful of pages. This update completes the migration: every page and shared
component (Bugs, Dashboard, Developers,
Equipment, Infra, Modules, Offices,
Prestige, Statistics, Upgrades,
DeveloperCard, and HudItem) now injects and uses
NumberFormatService instead of calling the old static
Numbers.FormatedNumber() helper directly.
As a result, the locale and compact-notation preferences set in the Settings page are
now applied consistently across the entire UI - numbers will format with the chosen
thousand separator and decimal style everywhere, not just on the pages that were
previously updated.
- Migrated all 10 pages and 2 shared components to injected
NumberFormatService
- Removed direct imports of the static
Numbers helper from migrated files
- Locale (Auto / en-US / de-DE) and compact notation now apply site-wide
A dedicated Settings page (/settings) was added to the
sidebar navigation, consolidating all player-configurable options in one place. Display
settings (number locale, compact notation) and game-loop tick rate were moved here from
the Save page. The performance debug overlay toggle is also surfaced here when running
on localhost.
A performance pass cleaned up rendering across eight pages (Achievements, Dashboard,
Developers, Equipment, Infra, Upgrades, Prestige, Offices), removing redundant
tick-subscriptions and tightening dirty-flag logic. A subscription-leak bug in the
Dashboard's Dispose() method (OnTick += β¦ instead of
OnTick -= β¦) was also corrected.
- New Settings page: sound controls, game-loop tick rate, display format, debug overlay
- Rendering performance pass across 8 pages - reduced unnecessary re-renders
- Fixed OnTick subscription leak in Dashboard Dispose()
The Dashboard goals panel received a quality-of-life overhaul: Buy buttons now appear
directly inside each goal card so players can act on a recommendation without navigating
away. A new "Next Equipment" goal card was added, showing the upcoming hardware tier's
DPS multiplier and purchase cost at a glance.
The prestige point formula was reworked to award points more gradually. The previous
log10(x)−3 curve was replaced with log10(x)*2−5, giving roughly 2–3x
more points per run and making the prestige skill tree accessible much earlier in a
reset cycle.
A new prestige skill, Automated Bug Triage (Quality branch, 2 PP),
was added. Once purchased, the game loop automatically starts fixing every new bug
each tick so players never need to manually click the fix button again.
- Goals panel: Buy/hire buttons inline for upgrades, equipment, and infrastructure goals
- New "Next Equipment" goal card with DPS multiplier and cost
- Upgrade goal cards show cost type (β¬ vs DP) and description inline
- Prestige point formula rebalanced for finer granularity and earlier rewards
- New prestige skill: Automated Bug Triage (auto-fixes bugs each tick, money cost still applies)
A significant technical pass improved rendering performance and UX across the board.
Pages previously re-rendered on every game tick regardless of whether their data had
changed. They now subscribe to focused events (OnEconomyChanged,
OnBugsChanged, OnDevsChanged) and use a dirty-flag pattern
to skip unnecessary renders, keeping the UI snappy even at high tick rates.
A new PerformanceService tracks tick timing (average and p95 latency)
and save duration. A debug overlay on the Dashboard exposes these metrics along with
a subscription-leak detector; it can be toggled from the Save page. A companion
NumberFormatService centralises number formatting with per-player
locale support (Auto, en-US, de-DE) and compact notation, both persisted in the save file.
Save writes are now throttled to at most one write every two seconds, with rapid saves
coalesced so only the latest state is written. The Developers page gained hold-to-repeat
hire buttons and bulk promote/hire-all controls.
- Event-driven rendering: pages subscribe only to events relevant to their data
- PerformanceService: tick avg/p95 timing, save duration, subscription leak detection
- Debug performance overlay on Dashboard (toggled from Save page)
- NumberFormatService: locale override (Auto/en-US/de-DE) and compact notation, saved per profile
- LocalStorageSaveService: throttled writes (max 1 per 2s), coalesced rapid saves
- Developers page: hold-to-repeat hire buttons, Promote All, Hire All of type
This update ships a new save format (v2) designed to be smaller, safer, and easier
to evolve over time. Instead of storing the entire runtime GameState, the game now
saves a lean DTO containing only player-specific progress, while static definitions
(modules, upgrades, offices, achievement metadata) are regenerated from code during load.
Saves are now compressed (GZip + Base64) before writing to localStorage, and the loader
remains backward compatible with legacy v1 saves. On the gameplay side, bug difficulty
now scales with your current DPS to keep fixes meaningful, security breach losses are
capped to avoid unfair bankruptcies, and several systems were hardened for stability.
- Added Save v2: new lean
SaveData model + full rehydration on load
- Compressed saves in localStorage (GZip + Base64,
gz: prefix) with legacy v1 support
- Bug DP cost now scales with current DPS (targets ~10β30s fix time by severity)
- Capped security breach losses so events canβt push the balance below a safe floor
- Upgrades can now cost DP (split proportionally between Frontend/Backend DP)
- Leaving an office fires all developers and forces economy recalculation
- Prestige is now async, awaits save, and resets equipment properly
- Improved loop resilience: tick errors are swallowed to keep the game running
- UI polish: click feedback stability, βno moneyβ hire toast, tick-based refresh on pages, CSS improvements
- Inserted AdSense blocks in About/Devlog for policy-safe monetization placements
A new Equipment system was added that lets players upgrade their team's hardware.
Seven tiers range from no equipment to an AI-Accelerated Station, each providing
a global DPS multiplier. This gives mid-game players another meaningful spending
target between office upgrades.
A welcome-back modal now greets returning players and shows what happened while
they were away, reinforcing the idle progression loop.
- Added 7-tier equipment system (1.0xβ1.60x DPS)
- Introduced welcome-back modal for returning players
- New sidebar navigation entry for equipment page
A round of critical economy fixes addressed issues that surfaced during
extended play sessions. The DP system could overflow under certain prestige
multiplier combinations, and bankruptcy events were chain-firing instead of
triggering once.
Statistics tracking was also improved to accurately reflect lifetime earnings,
total bugs fixed, and other cumulative metrics used by the achievement system.
- Fixed DP overflow at high prestige multipliers
- Prevented bankruptcy from chain-firing repeatedly
- Corrected stats tracking for achievements
The biggest feature update so far introduced three major systems at once.
The prestige mechanic allows players to reset their company in exchange for
permanent skill points distributed across four branches: Income, Development,
Quality, and Management.
A random event system was added with eight event types-four positive (viral
traffic, hackathons, enterprise contracts, open-source boosts) and four negative
(outages, talent drain, security breaches, market crashes). Events keep
late-game sessions dynamic and unpredictable.
Over 60 achievements were introduced covering modules, hiring, bug fixing,
earnings, infrastructure progression, and event encounters.
- Prestige system with 4-branch skill tree (18 nodes)
- 8 random event types with scaling duration
- 60+ achievements across all game systems
- Major balance pass on upgrade costs and DPS curves
The focus of this phase was establishing a stable economic foundation.
Developer salaries, module income, and infrastructure scaling were refactored
to better reflect long-term progression.
A major issue identified early was exponential cost inflation without
sufficient counter-balancing systems. This led to a redesign of growth curves
and tighter constraints on hiring and upgrades.
- Reworked developer salary scaling
- Introduced infrastructure-based hiring limits
- Stabilized early-game income spikes
The application layout was split into two clearly defined areas:
gameplay screens and informational content pages.
This change ensures that advertisements are never displayed inside
interactive gameplay interfaces and remain compliant with Google
AdSense policies.
- Introduced content-only pages
- Removed global ad loading
- Added safe editorial ad placements