Smarter Gauge Sampling to Protect Your Quota
Apps that report gauge metrics very frequently from many devices can now have a minimum sampling interval applied, so a high-frequency gauge no longer burns through your monthly event quota. Counters are never affected — every increment is always kept.
- Quota-friendly gauges: when enabled for an app, gauge data points arriving faster than the configured interval are skipped server-side, keeping one representative value per interval per device
- Counters always intact: only gauges are rate-limited — counter totals are never reduced, so your sums stay exact
Faster Usage & Quota Calculations
Monthly usage and quota figures now load faster for accounts that send a lot of metrics, thanks to a new database index behind the scenes.
- Quicker monthly counts: computing how many events and metric data points you’ve used this month no longer scans unrelated data — usage and quota checks stay fast as your history grows
DLL SDK — Cleaner Startup & Clearer Stack-Trace Guidance
Using the ExeWatch DLL from a non-Delphi app (.NET, C++Builder, C++)? Startup is now quieter and the docs spell out exactly how error stack traces are captured.
- No more spurious startup warning: the DLL no longer logs the “missing VCL/FMX exception hook” message in non-Delphi apps, where that advice never applied — your event list stays clean
- Clearer stack-trace guidance: the docs now explain that with the DLL your application supplies the error stack trace (with a ready-to-use C++Builder example), while automatic capture stays built in for the Delphi, .NET, Python and JavaScript SDKs
Nested Timing Traces — Profiler-Style Performance Trees
Timings can now be nested into a tree, just like a profiler. Wrap a piece of work in a trace and every timing inside it becomes a child span, shown as a waterfall in the dashboard — so you can see exactly where a slow operation spends its time, not just its total. Available in every SDK.
- Nested traces:
StartTrace / EndTrace turn a group of timings into a parent/child tree. Open the trace from the log list to see a waterfall of every step and how long each took
- Loops collapse cleanly: a timing repeated in a loop (e.g. rendering 500 rows) merges into a single node with count, average, min, max and p95 — no wall of identical entries
- Every SDK: traces work in the Delphi native, .NET, Python, JavaScript and DLL SDKs, and ship with a ready-to-run demo in each sample project
- Smooth DLL upgrades: from this release, you can drop a newer ExeWatch DLL next to your existing application and it just works — no need to recompile your app to pick up new SDK features
- Fully backward compatible: existing single timings keep working exactly as before — tracing is opt-in and purely additive
Renewal Reminders for Custom Plans
On a custom plan arranged directly with our team? We'll now remind you by email before it ends, so renewing is never a last-minute surprise.
- Heads-up before expiry: a friendly email 7 days and 2 days before your custom plan's end date
Delphi SDK Reliability on Legacy Hardware
The Delphi SDK no longer triggers a Windows "No Disk" popup when collecting device info on machines with empty removable drives, and Linux cross-compilation is now exercised on every build.
- No more "No Disk" popup: collecting device info on hosts with an empty removable drive (e.g. a physical floppy with no media, common on Server 2016) no longer raises the Windows critical-error popup — floppy-reserved letters are skipped and the error mode is suppressed for the probe
- Linux build verified continuously: the Delphi SDK's Linux64 cross-compile is now part of the standard build so the long-advertised Linux support can't silently regress
- Clarified platform floor: the SDK documentation now states the real Windows floor (Vista / Server 2008) and Delphi floor (XE8)
Timezone-Aware Lists, Binary Build History & Owner-Only Billing
Last-seen times now follow your timezone selector, device update history shows the exact binary build, you can jump straight to a customer from the Logs view, and billing actions are now restricted to account owners.
- Local times in lists: the "Last seen" column on the Customers and Devices pages now respects your timezone selector instead of always showing UTC
- Binary build in update history: the device update history now shows the binary build alongside the app version (e.g.
4.10 (4.1.0.1045)), so builds are distinguishable even when the app version is unchanged
- Jump to customer from Logs: click a customer's name in the Logs view to open their page
- Owner-only billing: opening the billing portal, starting a checkout, and editing the billing address are now restricted to account owners
Plan-Limit Notices & Request Hardening
Reaching your plan's metric limit now shows up directly in your logs, and oversized requests are turned away up front to keep the service fast and stable.
- Custom-metric limit notice: reaching your plan's metric limit now leaves an
ew.system notice in your Logs view (cooldown 6h), in addition to the email
- Request size guard: abnormally large requests are rejected up front to protect platform stability
Data Anomaly Notices
ExeWatch now tells you, directly in your own logs, whenever it had to alter or drop something an SDK sent that wasn't quite right — so data issues never pass unnoticed.
- ew.system anomaly notices: a system message appears in your Logs view for an over-long truncated message, more than 8 global tags, use of the reserved
ew.system tag, NULL/binary characters, oversized event metadata (capped at 16 KB), a device clock set in the future, or an extreme/garbage metric value
System Notices in Your Logs
When ExeWatch handles something automatically — like dropping a malformed metric — it now leaves a clear note directly in your app's log stream, so nothing happens silently behind your back.
- ew.system notices: the platform can post system messages into your Logs view (e.g. "dropped a malformed metric"), visible and filterable by the reserved
ew.system tag
- Reserved tag:
ew.system is reserved for ExeWatch and stripped from SDK-sent logs, so a system notice is always genuine
- Never counted against quota: these platform notices do not count toward your monthly event limit
Metrics Ingestion Hardening
A single malformed metric data point no longer causes the whole batch to be rejected.
- Resilient metric ingestion: if a corrupt metric (a non-finite or out-of-range value) is received, it is now dropped and logged while the rest of the batch is saved normally — previously one bad point failed the entire batch
Quota Pause: Clearer & Self-Healing
When an account reaches its monthly event quota the SDK is paused to protect your plan. That state is now shown clearly in the dashboard and resumes on its own as soon as you are back under the limit.
- "Logging paused" banner: the app dashboard now shows a clear notice when logging is paused because the monthly event quota was reached — no more wondering whether something is broken
- Automatic resume: logging restarts on its own once usage drops back under your plan limit, instead of staying paused
- Shorter pause window: the maximum pause was reduced to one hour
Reset Data: Faster & Safer
Resetting application data is now near-instant and no longer touches your customer and device list — it clears historical logs and metrics only, and the customer/device roster repopulates automatically as your app keeps reporting.
- Logs & metrics only: Reset Data now deletes historical log events and metrics. Customers, devices, API keys, alerts and team settings are all preserved
- Your customer list stays put: active customers and devices are kept and simply keep updating as new data arrives, instead of disappearing and rebuilding
- More reliable on busy apps: the reset no longer competes with live data ingestion, so it completes quickly even on high-traffic applications
Email Delivery Hotfix
Registration verification emails, team invites, and a few other transactional emails were not being delivered in some configurations. The issue is now resolved and any registration whose verification email did not arrive can be retried.
- Account verification emails restored: the signup confirmation email now reaches every recipient again. If you signed up recently and did not receive it, simply try the signup again or request a new verification link from the login page
- Team invites delivered reliably: invitations to new team members no longer get lost on the way out
- Alert and welcome emails fixed too: the same underlying issue affected log-alert notifications and welcome emails — both are now back to normal
Reset Data Reliability & Team Re-Invite Fix
Resetting application data on large datasets is now safe and asynchronous, with a completion email and clear UI feedback. Plus a fix that lets you re-invite a team member after a stale invite without manual cleanup.
- Asynchronous Reset Data: clicking Reset Data on an app with millions of log events used to take minutes and could time out before finishing, leaving the data in place. The reset now runs in the background in batches and finishes reliably no matter the table size
- "Reset queued" UI feedback: a banner appears in the app settings while the reset is in progress and the Reset button stays disabled until it completes, so you always know what state the app is in
- Reset completion email: account owners receive an email when the reset finishes, with a summary of how many log events, metrics and inactive customers were removed
- Team re-invite fix: if a previous invite to a team member had become stale (expired or cancelled), inviting that same email again now works without having to clean up the old invite first
C++Builder & MSVC SDKs, Global Tags & Per-Customer Alerts
Native C++Builder and Microsoft Visual C++ support join the SDK family via the ExeWatch DLL, alerts and logs can now be filtered by a specific customer and by global tags, and every SDK gains a graceful flush API plus thread-local timing measurements.
- C++Builder & MSVC support: ship to customers using Embarcadero C++Builder or Microsoft Visual C++ via the ExeWatch DLL. A dual-mode C header plus a ready-to-paste dynamic-loader file mean no static link is required, and older Delphi versions (4 to XE7) can now integrate too
- Global Tags: declare tags once in the Delphi or JavaScript SDK and they ride along on every log event; the log viewer gets a Global Tags filter so you can slice by deployment, tenant, build flavor, or anything else you want
- Per-customer alert filter: log-level and timing alerts can now be scoped to a single Customer ID, so high-volume customers no longer drown out the rest of your fleet
WaitForSending API across all SDKs: console apps and short-lived processes can now block until queued logs are uploaded before exiting. Full traces are guaranteed even when an application exits quickly through Halt or after Application.Run returns
- Thread-local timings: every thread keeps its own independent timer stack across the Delphi, .NET and Python SDKs. Begin and end timing measurements with confidence in multi-threaded workloads
- JavaScript SDK error capture: HTTP errors now ship with the response body automatically, and a new
httpErrorExtractor hook lets you customise exactly what gets attached
- Per-app file queue isolation: each application's API key gets its own offline-events subdirectory, so multiple ExeWatch apps can safely share a storage path on the same machine
- Monthly event quota notifications: account owners and team members get an email at 80% (warning) and at 100% (limit reached) of the monthly event quota, so a runaway logger never silently fills your plan
Several of these improvements began as conversations with teams running ExeWatch at enterprise scale. We refined them together and then made them available on every plan, so the wider community benefits from what those customers asked for. A heartfelt thank-you to everyone who took the time to share their use cases. Please keep them coming.
Delphi SDK v0.22.0 · .NET SDK v0.5.0 · JS SDK v0.15.0 · Python SDK v0.1.0 · DLL SDK (C/C++/MSVC) ABI v3
New Reorder Experience, Event Time & Anonymization Fix
A dedicated dialog for reordering applications, log timestamps now reflect when the event actually happened on the client, in-app confirm dialogs and toasts replace browser popups, and a Delphi SDK fix fully protects usernames when anonymization is enabled.
- Redesigned app reordering: a dedicated dialog with a clean list, a clear "Custom order active" indicator, and one-click Reset to default
- Event Time column in the log list: the log viewer now shows when the event actually happened on the client, not when it arrived at the server (the log detail modal still displays both plus the network latency)
- Sticky page header: the title bar stays visible while you scroll long log or timing tables
- In-app confirm dialogs and toasts: native browser popups are gone — delete app, reset data, reset order, sync billing, etc. now use the dark-themed ExeWatch dialogs and success toasts
- Delphi SDK anonymization fix: with AnonymizeDeviceId enabled, the Windows username is no longer shipped — previously only the device ID was hashed, so the real login still appeared in tooltips and on the Devices page
- Delphi SDK line endings: ExeWatchSDKv1.pas always ships with CRLF, no more "inconsistent line endings" warning when added to a project
- Delphi docs updates: corrected the InitialCustomDeviceInfo example and added a new "Coexisting with madExcept / EurekaLog" integration section
- Global SDK Configuration in Admin Console: set flush interval, batch size, sampling rate and max message length once and have the value applied to every application
- Confirm dialog stacking fix: confirmations now always render above the App Settings modal (previously could end up hidden behind it)
Delphi SDK v0.20.1 · .NET SDK v0.4.0 · JS SDK v0.13.1 · Python SDK v0.1.0
Python SDK & AnonymizeDeviceId Fix
New Python SDK with full feature parity, and a bug fix for the Delphi AnonymizeDeviceId option.
- Python SDK: single-file SDK for Python 3.7+ with zero external dependencies — logging, breadcrumbs, timing, metrics, user identity, tags, device info, offline persistence, background shipping
- Python SDK selectable when creating Windows, Linux, or macOS applications
- SDK download endpoint, integration guide, and inline code snippets for Python
- Public documentation and landing page updated with Python SDK section
- Fixed
EIntOverflow in Delphi SDK AnonymizeUsername when projects enable overflow checking ({$Q+})
- Rebuilt Delphi DLL SDK (32-bit and 64-bit) with the overflow fix
- New
invoke sdk-python task integrated into invoke sdk-all
Delphi SDK v0.20.0 · .NET SDK v0.4.0 · JS SDK v0.13.1 · Python SDK v0.1.0
Android Support & UI Improvements
Full Android platform support for the Delphi SDK, breadcrumb visibility improvements, and FMX download fix.
- Full Android platform support in Delphi SDK: device info (RAM, CPU, display resolution), app version from AndroidManifest, kernel thread ID
- Fixed missing FMX GUI option in SDK download page for Delphi apps
- Breadcrumb indicator icon in log list with count tooltip
- Sequential numbering on breadcrumbs in log detail view
Delphi SDK v0.20.0 · .NET SDK v0.4.0 · JS SDK v0.13.1
Stack Traces, Generic Webhooks & UI Improvements
Automatic stack trace capture on all errors, generic webhook integration with retry, and a more compact log detail view.
- .NET / C# SDK with full Delphi parity: logging, breadcrumbs, timing, metrics, hardware info, exception capture, offline persistence
- Automatic stack trace capture for all Error and Fatal logs (Delphi SDK, Windows)
- Generic webhook integration with token authentication and automatic retry (Business plan)
- New Integrations modal for Discord and Webhook configuration with per-type test
- Exception details card in Log Detail (class, source, address)
- Compact Log Detail layout with message immediately visible
- Sortable Metrics tables with sort persistence across refresh
- Devices table with fixed-width columns and cleaner layout
- Fixed breadcrumb thread isolation on Linux
- Optimized map file loading with O(n log n) sorting
Delphi SDK v0.19.0 · .NET SDK v0.4.0 · JS SDK v0.13.1
Custom Metrics, Device Snapshots & Responsive UI
Send custom numeric metrics, plan-based health monitoring, immutable device state snapshots on log events, and a fully responsive interface.
- Custom Metrics page with counters and gauges, time-series charts, and gauge configuration
- Delete metric data directly from the detail modal
- Health monitoring tiered by plan: basic (Hobby), error-based (Pro), full (Business)
- Anti-flapping logic prevents rapid health status oscillations
- Share applications in read-only mode with external users — give clients and partners live visibility without granting full access
- Device state snapshots: each log event captures an immutable snapshot of the device state at creation time
- Version filters on Logs page to filter by App Version and Binary Version
- Adaptive toolbar with three responsive layouts for desktop, tablet, and mobile
- Optimized background jobs for better scalability
- JavaScript SDK: no more lost logs when users close the browser tab
Delphi SDK v0.18.2 · JS SDK v0.13.1
Health Alerts, Discord & Security Hardening
Automatic health status monitoring with notifications, Discord integration, and infrastructure security improvements.
- Health Score on the overview dashboard — monitors error rate, crashes, and slow operations (24h)
- Health status change alerts: automatic email & Discord notifications when an app degrades or recovers
- Health history modal with 7-day transition timeline
- Discord webhook integration for all alert types (log level, timing, health)
- Rate limiting per IP on login, SDK ingest, and API endpoints
- JavaScript SDK:
ignoreUrls option to filter out third-party errors
- Privacy Policy & Terms of Service guide with GDPR-compliant templates
- Timing page: fixed special characters in timing IDs and improved duration display
- Smarter device table: long OS versions are now truncated, platform icons in sidebar
Usage Analytics
Understand how your software is used with comprehensive usage analytics.
- Active sessions, devices, and customers over time with trend deltas
- Usage heatmap (hour × day of week) to spot peak usage patterns
- Top customers ranking by session count
- OS distribution chart across all devices
- Error rate trend by app version
- Time range selector: 7d, 30d, 90d
Delphi 12 Support & OS Change Tracking
SDK compatibility improvements and enhanced device tracking.
- Delphi 12 (Embarcadero RAD Studio) full SDK support
- Automatic OS change detection on devices (e.g. Windows 10 → 11)
- App Updates page improvements with OS update badges
Thread-Local Breadcrumbs
Improved breadcrumb handling for multi-threaded applications.
- Thread-local breadcrumb storage in Delphi SDK
- Each thread maintains its own breadcrumb trail
- Alerts page timezone: dates now convert UTC → local timezone
Device Version History & Automatic Exception Capture
Track version updates across all devices and capture unhandled exceptions automatically.
- Device version history with timeline in device modal
- App Updates page with stats, filters, and pagination
- Automatic unhandled exception capture in Delphi SDK
- VCL hook unit for GUI exception capture
- FMX hook unit for FireMonkey exception capture
- Console app crash detection via System.ExceptProc
GDPR Compliance
Comprehensive GDPR compliance features for EU data protection requirements.
- Account pseudonymization instead of hard delete
- Complete data export including all personal data
- Data Processing Agreement (DPA) template
- Right to Restriction of Processing
- Email change functionality
- Email notifications for restriction and email changes
Email Alerts & Platform-Based Architecture
Threshold-based email alerts and per-platform application architecture.
- Email alerts with configurable thresholds, cooldown, and tag filters
- Timing alerts for slow operation detection
- One application = one platform (Windows, Linux, macOS, Android, Browser). iOS coming soon
- Platform-based API key prefixes (ew_win_, ew_lin_, ew_mac_, etc.)
- Configurable slow threshold per application
- Sortable columns on Timing page
Initial Release
The first public release of ExeWatch, a complete APM platform for server, desktop, and web applications.
- Centralized log aggregation with 5 severity levels
- Performance timing and profiling (Avg, Min, Max, P95)
- Hardware info collection (CPU, RAM, disks, monitors, OS)
- Multi-customer and multi-device tracking
- Breadcrumbs trail for debugging
- User identity tracking
- Global tags and version tracking
- Offline persistence with automatic retry
- Native Delphi SDK (VCL, FMX, Console, Services)
- JavaScript SDK for web applications
- Team management with role-based access
- Stripe billing integration (Hobby, Pro, Business plans)