Releases: HW-Lab-Hardware-Design-Agency/WebScreen-Software
Release list
v2.0.7
NTP Time Synchronization & Timezone Support
New Features
Built-in NTP Time Sync
- Automatic time synchronization: Device syncs time via NTP (
pool.ntp.org) automatically when WiFi connects — no external API dependency. - Reconnection support: NTP re-syncs automatically if WiFi disconnects and reconnects.
- Configurable NTP server: Override the default server via
system.ntp_serverinwebscreen.json.
Full Timezone Support
- POSIX TZ strings: Device timezone is configured using standard POSIX TZ strings, supporting all global timezones with DST rules.
- Three format modes: Accepts
UTC, numeric offset (e.g.-3), or full POSIX TZ string (e.g.EST5EDT,M3.2.0,M11.1.0). - Admin tool timezone dropdown: New
<select>dropdown with 400+ IANA timezones grouped by region (Africa, America, Asia, etc.), automatically mapped to POSIX TZ strings. - Auto-detect button: Detects the user's browser timezone and selects the matching entry.
JavaScript Time API
- 9 new functions available in JavaScript applications:
get_hours(),get_minutes(),get_seconds(),get_year(),get_month(),get_day(),get_weekday(),get_epoch(),
ntp_synced(). - No HTTP calls needed: Clock apps no longer depend on external time APIs.
Serial Commands
/time: Display current device time, epoch, and day of week./settime <epoch> [timezone]: Manually set time from epoch with optional POSIX TZ string.
Configuration
Add timezone to your webscreen.json:
json
{
"settings": {
"wifi": {
"ssid": "MyNetwork",
"pass": "MyPassword"
}
},
"display": {
"brightness": 200
},
"timezone": "EST5EDT,M3.2.0,M11.1.0",
"script": "app.js"
}
POSIX TZ String Examples:
┌──────────────┬────────────────────────────┐
│ Location │ POSIX TZ String │
├──────────────┼────────────────────────────┤
│ UTC │ UTC0 │
├──────────────┼────────────────────────────┤
│ US Eastern │ EST5EDT,M3.2.0,M11.1.0 │
├──────────────┼────────────────────────────┤
│ US Pacific │ PST8PDT,M3.2.0,M11.1.0 │
├──────────────┼────────────────────────────┤
│ Buenos Aires │ <-03>3 │
├──────────────┼────────────────────────────┤
│ Tokyo │ JST-9 │
├──────────────┼────────────────────────────┤
│ London │ GMT0BST,M3.5.0/1,M10.5.0 │
├──────────────┼────────────────────────────┤
│ Berlin │ CET-1CEST,M3.5.0,M10.5.0/3 │
└──────────────┴────────────────────────────┘
Full database: https://github.com/nayarsystems/posix_tz_db
JavaScript API Usage:
// Check if time is available
if (ntp_synced()) {
let h = get_hours();
let m = get_minutes();
let s = get_seconds();
print("Time: " + numberToString(h) + ":" + numberToString(m) + ":" + numberToString(s));
let year = get_year();
let month = get_month();
let day = get_day();
print("Date: " + numberToString(year) + "-" + numberToString(month) + "-" + numberToString(day));
}
Serial Command Usage:
WebScreen> /time
Current time: 2026-02-17 14:23:45
Epoch: 1771337025
Day of week: 2 (0=Sun)
WebScreen> /settime 1771337025 <-03>3
Time set: 2026-02-17 11:23:45
Full Changelog: 2.0.6...2.0.7
v2.0.6
Display Brightness Control & Admin UI Improvements
New Features
Display Brightness Control
- Hardware brightness support: Direct AMOLED brightness control via RM67162 command (0x51), with a range of 0 (off) to 255 (maximum).
- JavaScript API: New
set_brightness(value)andget_brightness()functions available in JavaScript applications. - Serial command: New
/brightness <0-255>serial command to set or query display brightness interactively. - Configuration persistence: Brightness is stored in
webscreen.jsonunderdisplay.brightnessand applied automatically on boot. - Default value: 200 (approximately 78% brightness).
Admin Tool UI
- Real-time brightness slider: Adjusting the brightness slider in the Admin tool sends the change to the device immediately.
Configuration
Add brightness to your webscreen.json:
{
"settings": {
"wifi": {
"ssid": "MyNetwork",
"pass": "MyPassword"
}
},
"display": {
"brightness": 200
},
"script": "app.js"
}JavaScript API Usage
// Set brightness
set_brightness(200);
// Read current brightness
let level = get_brightness();
print("Brightness: " + numberToString(level));Serial Command Usage
WebScreen> /brightness
Current brightness: 200
WebScreen> /brightness 150
[OK] Brightness set to 150
Full Changelog: 2.0.5...2.0.6
v2.0.5
Memory & Performance
- PSRAM for JavaScript: Elk heap now uses 256KB of PSRAM (up from 96KB), enabling more complex apps
HTTP Improvements
- Custom ports: http_get, http_post, http_delete now support custom ports
http_get("http://192.168.1.20:3000/api") - HTTP + HTTPS: All methods now support both protocols (previously POST/DELETE were HTTPS-only)
- Reliability fixes: Added response wait timeout, retry logic with exponential backoff, case-insensitive header parsing
- Debug logging: HTTP requests now log connection status and response details to serial
Bug Fixes
- Fixed intermittent HTTP failures when server is slow to respond
- Fixed header parsing for servers using lowercase headers
Documentation
- Updated API docs with LVGL configuration (available fonts, widgets, image formats)
- Added memory guidelines for app development
Full Changelog: 2.0.4...2.0.5
v2.0.3 - PSRAM Memory Allocation
v2.0.3 - PSRAM Memory Allocation
Highlights
JavaScript apps now have 256KB of heap memory (up from 96KB) by utilizing the ESP32-S3's PSRAM.
Changes
Memory Improvements
- Elk JavaScript heap moved from regular RAM to PSRAM (8MB available)
- Heap size increased from 96KB to 256KB (2.7× larger)
- Automatic fallback to 96KB regular RAM if PSRAM unavailable
- Complex apps with multiple styles and labels now run without memory crashes
Technical Details
- elk_memory now dynamically allocated via ps_malloc()
- Added init_elk_memory() for PSRAM initialization with fallback
- Boot message shows allocation: Elk heap allocated in PSRAM: 256 KB
Compatibility
- Fully backward compatible with existing scripts
- No changes required to JavaScript apps
Full Changelog: 2.0.2...2.0.3
v2.0.2 Release Notes
Bug Fixes
- Fix long-running script stability (crashes after ~10 minutes)
- Increase HTTP GET timeout and add exponential backoff retries
Improvements
- Increase Elk JS heap from 48KB to 96KB
- Add periodic garbage collection every 60 timer callbacks
- Add memory monitoring with auto-recovery reboot
- Increase JS task stack from 16KB to 24KB
- Optimize label_set_text with static buffer
- Remove verbose debug logging from hot paths
v2.0.1 Release Notes
Performance & Stability
- Increased JavaScript heap from 48KB to 64KB for larger scripts
- Increased JS task stack from 16KB to 24KB for complex operations
- Optimized label_set_text - uses static buffer to prevent heap fragmentation
- Memory protection - timer callbacks skip execution when memory < 15KB
- Reduced debug logging - cleaner serial output, faster execution
New Features
- HTTP support for http_get() - now supports both HTTP and HTTPS URLs
- HTTP retry mechanism - automatically retries failed requests (up to 2 times)
- mem_stats() function - returns free heap bytes for debugging
- draw_rect() improvements - optional color parameter, returns handle
Bug Fixes
- Fixed nested config keys - /config get settings.wifi.ssid now works
- Fixed JS error reporting - shows actual error messages instead of generic errors
- Fixed serial command parsing - improved reliability
API Changes
- draw_rect(x, y, w, h) → draw_rect(x, y, w, h, color) - color is optional (default: green)
- show_gif_from_sd(path, x, y) → show_gif_from_sd(filepath) - simplified signature
Documentation
- Updated API.md with new functions and signatures
0.5.0-beta
What's Changed
Full Changelog: 0.4.0-beta...0.5.0-beta
0.4.0-beta
0.3.0-beta
0.2.0-beta
What's Changed
- feature: improve performance and small improvements. by @eleonel in #9
- Feature/timer by @eleonel in #12
- feature: Added missing binaries for easy flashing. by @eleonel in #13
- feature: Now we can set the position on gif_from_sd. by @eleonel in #14
- Setup bg from config by @eleonel in #15
- feature: Added more sizes for Montserrat font. by @eleonel in #16
- chore: Remove lvgl msgbox related functions. by @eleonel in #18
- feature: Added function for retry connection to sd on different speeds. by @eleonel in #19
Full Changelog: 0.1.0-beta...0.2.0-beta