Skip to content

ESP32: one HTTP client for the pulls; a wake's scene switch skips the scene it leaves - #528

Merged
mariusandra merged 2 commits into
mainfrom
esp32-http-helper
Oct 11, 2026
Merged

mariusandra merged 2 commits into
mainfrom
esp32-http-helper

Conversation

@mariusandra

@mariusandra mariusandra commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

Follow-up to #525, on top of #527.

One HTTP client for the small pulls and posts

The todo from #525: the settings pull, the scenes pull, the commands pull, the tz slice lookup and the OTA manifest each set up esp_http_client by hand. fos_backend_http.c is the one copy: bearer header, optional If-None-Match, optional JSON body, the response ETag, a bounded body read that grows up to the cap for chunked answers, PSRAM where the board has it. The five callers keep only what they do with the answer; fos_settings.c and fos_scenes.c lose their private read_body and ETag handlers. The streams stay as they were: the remote-render bitmap, the OTA image and the image push. Size: about 0.6 KB off the local esp32-s3 image against the #525 head; the copies were mostly call sequences, so less than the todo hoped.

A scene switch sent before the first render does not build the scene it leaves

One refinement on #527's fix (an event that arrives before the first render builds the current scene): setCurrentScene is the one event the dispatcher serves without a scene, and the backend queues exactly that for a frame's wake (set_current_scene on the command queue). Building the scene being left first is seconds of JavaScript transpiling for a scene nobody sees. A case in test_single_scene_host.nim pins it, and docs/events.md "Known host differences" gets the row.

One thing to keep an eye on with #527's approach, not changed here: send runs on whatever task sent the event, so a cloud scene_event or an HTTP /event that lands in the window between boot and the first render builds the scene on the cloud or httpd task rather than the render task. The button and command-queue cases are on the render task.

Testing

🤖 Generated with Claude Code

@mariusandra mariusandra changed the title ESP32: one HTTP client for the pulls, and events sent before the scene is built ESP32: one HTTP client for the pulls; a wake's scene switch skips the scene it leaves Oct 11, 2026
@github-actions

github-actions Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor

ESP32 firmware size

Built from a398a62 by this run; compared with the latest release v2026.10.4.

Image This PR v2026.10.4 Δ
esp32-s3 app (OTA image) 3,232,080
89.7% of 3520K slot, 364 KB free
3,227,264 +4,816 (+0.1%)
esp32-s3 merged flash image 3,297,616 3,292,800 +4,816 (+0.1%)
esp32-s3-32mb app (OTA image) 3,232,064
78.3% of 4032K slot, 876 KB free
3,227,264 +4,800 (+0.1%)
esp32-s3-32mb merged flash image 3,363,136 3,358,336 +4,800 (+0.1%)

Breakdown by subsystem — esp32-s3

Subsystem This PR v2026.10.4 Δ
FrameOS core (Nim) 458,914 456,304 +2,610 (+0.6%)
QuickJS 356,232 356,156 +76 (+0.0%)
FrameOS apps (Nim) 318,604 318,596 +8 (+0.0%)
pixie 300,796 300,801 -5 (-0.0%)
Wi-Fi stack 295,300 295,316 -16 (-0.0%)
Nim stdlib 253,778 253,870 -92 (-0.0%)
ESP-IDF misc 177,929 177,929 ±0
Embedded font 146,370 146,358 +12 (+0.0%)
String pool (attributed to efuse) 134,561 134,253 +308 (+0.2%)
mbedTLS + certificates 132,782 132,711 +71 (+0.1%)
lwIP / HTTP / WebSocket 126,572 126,572 ±0
fos_* firmware shell (C) 126,160 124,333 +1,827 (+1.5%)
libc / libm / newlib 116,259 116,259 ±0
Storage (SPIFFS / FatFS / SD / NVS) 94,044 94,044 ±0
Nim packages (chrono, zippy, chroma, qrgen, ...) 71,909 71,861 +48 (+0.1%)
Display drivers (C) 64,938 64,934 +4 (+0.0%)
Crypto (monocypher) 35,165 35,245 -80 (-0.2%)
Total mapped flash 3,210,313 3,205,542 +4,771 (+0.1%)
Inside each subsystem

FrameOS core (Nim) — 458,914

Part This PR v2026.10.4 Δ
frameos/utils 109,461 109,529 -68 (-0.1%)
frameos/js_runtime 102,879 102,868 +11 (+0.0%)
frameos/interpreter.nim 100,288 100,714 -426 (-0.4%)
embedded_main.nim 19,215 19,227 -12 (-0.1%)
embedded_runtime.nim 16,897 14,099 +2,798 (+19.8%)
lib/tz.nim 16,738 16,735 +3 (+0.0%)
frameos_nim_glue.c.obj 10,421 10,309 +112 (+1.1%)
frameos/planner.nim 9,673 9,621 +52 (+0.5%)
frameos/types.nim 8,192 8,203 -11 (-0.1%)
frameos/event_loop.nim 8,076 8,081 -5 (-0.1%)
frameos/values.nim 6,810 6,817 -7 (-0.1%)
frameos/single_scene_host.nim 6,553 6,390 +163 (+2.6%)
frameos/apps.nim 6,348 6,364 -16 (-0.3%)
frameos/spool.nim 5,815 5,807 +8 (+0.1%)
embedded_scene.nim 4,945 4,949 -4 (-0.1%)
frameos/events_gen.nim 3,948 3,940 +8 (+0.2%)
frameos/input_state.nim 3,738 3,778 -40 (-1.1%)
frameos/app_config.nim 2,939 2,907 +32 (+1.1%)
frameos/reboot_reason.nim 2,664 2,676 -12 (-0.4%)
frameos/node_config.nim 2,614 2,590 +24 (+0.9%)
frameos/app_capabilities.nim 2,493 2,493 ±0
frameos/events.nim 2,334 2,366 -32 (-1.4%)
fos_netguard.c.obj 2,159 2,147 +12 (+0.6%)
frameos/refresh_interval.nim 1,647 1,635 +12 (+0.7%)
frameos/runtime_diagnostics.nim 767 763 +4 (+0.5%)
frameos/event_log.nim 415 415 ±0
fos_version.c.obj 328 324 +4 (+1.2%)
frameos/cloud 255 255 ±0
frameos/ids.nim 137 137 ±0
frameos/channels.nim 125 125 ±0
frameos/hal 40 40 ±0

QuickJS — 356,232

Part This PR v2026.10.4 Δ
quickjs.c.obj 283,653 283,637 +16 (+0.0%)
libunicode.c.obj 50,186 50,194 -8 (-0.0%)
libregexp.c.obj 14,031 13,983 +48 (+0.3%)
dtoa.c.obj 5,697 5,669 +28 (+0.5%)
cutils.c.obj 2,141 2,149 -8 (-0.4%)
fos_qjs_glue.c.obj 449 449 ±0
fos_quickjs_tz.c.obj 75 75 ±0

FrameOS apps (Nim) — 318,604

Part This PR v2026.10.4 Δ
apps/data/icalJson 50,301 50,301 ±0
apps/render/calendar 30,825 30,753 +72 (+0.2%)
apps/render/chart 21,521 21,525 -4 (-0.0%)
apps/data/immich 17,703 17,715 -12 (-0.1%)
apps/data/wikicommons 17,082 17,082 ±0
apps/data/openaiImage 13,962 13,962 ±0
apps/data/unsplash 11,056 11,056 ±0
apps/data/localImage 10,375 10,375 ±0
apps/data/weather 10,153 10,157 -4 (-0.0%)
apps/data/beRecycle 9,970 9,942 +28 (+0.3%)
apps/render/split 9,692 9,692 ±0
apps/data/eventsToAgenda 9,076 9,096 -20 (-0.2%)
apps/data/googlePhotos 9,048 9,064 -16 (-0.2%)
apps/apps.nim 8,679 8,659 +20 (+0.2%)
apps/render/zoomPan 8,576 8,572 +4 (+0.0%)
apps/data/haSensor 7,299 7,299 ±0
apps/data/openaiText 6,662 6,662 ±0
apps/render/text 5,439 5,439 ±0
apps/data/xmlToJson 5,424 5,428 -4 (-0.1%)
apps/render/svg 5,256 5,244 +12 (+0.2%)
apps/render/image 4,692 4,688 +4 (+0.1%)
apps/data/rotateImage 3,461 3,461 ±0
apps/logic/setAsState 3,461 3,453 +8 (+0.2%)
apps/data/downloadImage 3,329 3,397 -68 (-2.0%)
apps/render/gradient 3,193 3,189 +4 (+0.1%)
apps/data/qr 3,114 3,122 -8 (-0.3%)
apps/data/frameOSGallery 3,062 3,066 -4 (-0.1%)
apps/data/downloadUrl 3,057 3,061 -4 (-0.1%)
apps/render/color 2,820 2,820 ±0
apps/data/newImage 2,668 2,668 ±0
apps/data/resizeImage 2,558 2,558 ±0
apps/render/opacity 2,344 2,288 +56 (+2.4%)
apps/data/log 2,299 2,299 ±0
apps/data/prettyJson 2,221 2,225 -4 (-0.2%)
apps/data/clock 1,843 1,887 -44 (-2.3%)
apps/data/parseJson 1,844 1,848 -4 (-0.2%)
apps/logic/nextSleepDuration 1,655 1,655 ±0
apps/logic/ifElse 1,494 1,494 ±0
apps/logic/breakIfRendering 1,390 1,394 -4 (-0.3%)

pixie — 300,796

Part This PR v2026.10.4 Δ
pixie/fontformats/opentype.nim 55,542 55,543 -1 (-0.0%)
pixie/fileformats/webp.nim 37,509 37,521 -12 (-0.0%)
pixie/fileformats/svg.nim 37,039 37,047 -8 (-0.0%)
pixie/paths.nim 32,570 32,570 ±0
pixie/fileformats/jpeg.nim 25,330 25,330 ±0
pixie/fileformats/png.nim 22,841 22,841 ±0
pixie/images.nim 15,779 15,779 ±0
pixie/fonts.nim 11,015 11,019 -4 (-0.0%)
pixie/paints.nim 9,869 9,869 ±0
pixie/fileformats/bmp.nim 8,218 8,218 ±0
pixie/common.nim 7,432 7,428 +4 (+0.1%)
pixie/blends.nim 6,516 6,520 -4 (-0.1%)
pixie/fileformats/gif.nim 5,909 5,909 ±0
pixie/inflatestream.nim 5,341 5,325 +16 (+0.3%)
pixie.nim 5,192 5,192 ±0
pixie/fileformats/webp_vp8_tables.nim 3,881 3,881 ±0
pixie/fileformats/ppm.nim 3,677 3,685 -8 (-0.2%)
pixie/contexts.nim 3,062 3,050 +12 (+0.4%)
pixie/fileformats/qoi.nim 2,674 2,674 ±0
pixie/internal.nim 754 754 ±0
pixie/rgb565.nim 381 381 ±0
pixie/fontformats/svgfont.nim 215 215 ±0
pixie/decodebudget.nim 50 50 ±0

Wi-Fi stack — 295,300

Part This PR v2026.10.4 Δ
libnet80211.a 136,080 136,076 +4 (+0.0%)
libpp.a 62,110 62,082 +28 (+0.0%)
libwpa_supplicant.a 55,060 55,104 -44 (-0.1%)
libphy.a 34,168 34,176 -8 (-0.0%)
libesp_wifi.a 4,764 4,764 ±0
libesp_phy.a 2,533 2,533 ±0
libesp_coex.a 295 295 ±0
libcore.a 287 283 +4 (+1.4%)
libespnow.a 3 3 ±0

Nim stdlib — 253,778

Part This PR v2026.10.4 Δ
pure/collections/tables.nim 72,023 71,982 +41 (+0.1%)
system.nim 48,433 48,467 -34 (-0.1%)
pure/unicode.nim 17,405 17,405 ±0
pure/times.nim 16,970 16,984 -14 (-0.1%)
pure/json.nim 13,937 13,939 -2 (-0.0%)
std/private/dragonbox.nim 10,351 10,351 ±0
pure/strutils.nim 8,528 8,529 -1 (-0.0%)
pure/parsexml.nim 6,007 6,027 -20 (-0.3%)
pure/algorithm.nim 5,376 5,376 ±0
pure/base64.nim 5,290 5,290 ±0
pure/hashes.nim 4,181 4,181 ±0
pure/xmlparser.nim 3,555 3,555 ±0
pure/parsejson.nim 3,553 3,553 ±0
std/formatfloat.nim 3,508 3,508 ±0
pure/uri.nim 3,225 3,225 ±0
pure/collections/sets.nim 3,144 3,144 ±0
pure/streams.nim 2,820 2,820 ±0
pure/strformat.nim 2,641 2,641 ±0
std/syncio.nim 2,355 2,355 ±0
pure/xmltree.nim 2,047 2,047 ±0
pure/lexbase.nim 1,805 1,805 ±0
pure/parseutils.nim 1,753 1,753 ±0
system/exceptions.nim 1,598 1,598 ±0
pure/strtabs.nim 1,568 1,568 ±0
pure/pathnorm.nim 1,336 1,392 -56 (-4.0%)
pure/options.nim 1,152 1,152 ±0
std/private/ospaths2.nim 1,032 1,030 +2 (+0.2%)
pure/collections/lists.nim 979 979 ±0
system/dollars.nim 891 891 ±0
pure/math.nim 840 844 -4 (-0.5%)
pure/random.nim 835 835 ±0
pure/collections/deques.nim 826 830 -4 (-0.5%)
std/private/digitsutils.nim 651 651 ±0
std/oserrors.nim 633 633 ±0
std/private/osdirs.nim 572 572 ±0
std/monotimes.nim 401 401 ±0
std/private/oscommon.nim 329 329 ±0
std/envvars.nim 250 250 ±0
std/private/decode_helpers.nim 240 240 ±0
std/private/ossymlinks.nim 187 187 ±0
pure/bitops.nim 162 162 ±0
pure/os.nim 99 99 ±0
std/private/osfiles.nim 96 96 ±0
std/assertions.nim 87 87 ±0
core/macros.nim 65 65 ±0
system/iterators.nim 33 33 ±0
system/ctypes.nim 9 9 ±0

ESP-IDF misc — 177,929

Part This PR v2026.10.4 Δ
libesp_hw_support.a 37,622 37,622 ±0
libhal.a 21,492 21,492 ±0
libfreertos.a 17,190 17,190 ±0
libesp_system.a 13,776 13,776 ±0
libesp_driver_uart.a 11,627 11,627 ±0
libheap.a 8,652 8,652 ±0
libesp_driver_i2c.a 8,026 8,026 ±0
libesp_driver_spi.a 7,728 7,728 ±0
libconsole.a 5,733 5,733 ±0
libjson.a 4,940 4,940 ±0
libesp_driver_gpio.a 3,882 3,882 ±0
libbootloader_support.a 3,817 3,817 ±0
libxtensa.a 3,691 3,691 ±0
libesp_driver_usb_serial_jtag.a 3,408 3,408 ±0
libesp_ringbuf.a 3,322 3,322 ±0
libesp_event.a 3,241 3,241 ±0
libesp_mm.a 2,451 2,451 ±0
libapp_update.a 2,422 2,422 ±0
libesp_psram.a 2,329 2,329 ±0
libesp_timer.a 2,318 2,318 ±0
libsoc.a 2,315 2,315 ±0
libesp_adc.a 2,273 2,273 ±0
liblog.a 1,371 1,371 ±0
libpthread.a 1,365 1,365 ±0
libesp_security.a 1,042 1,042 ±0
libesp_rom.a 902 902 ±0
libesp_app_format.a 507 507 ±0
libxt_hal.a 437 437 ±0
libesp_common.a 26 26 ±0
libesp_pm.a 24 24 ±0

Embedded font — 146,370

Part This PR v2026.10.4 Δ
assets/fonts.nim 146,370 146,358 +12 (+0.0%)

String pool (attributed to efuse) — 134,561

Part This PR v2026.10.4 Δ
esp_efuse_utility.c.obj 133,523 133,215 +308 (+0.2%)
esp_efuse_rtc_calib.c.obj 558 558 ±0
esp_efuse_table.c.obj 268 268 ±0
esp_efuse_api.c.obj 151 151 ±0
esp_efuse_startup.c.obj 61 61 ±0

mbedTLS + certificates — 132,782

Part This PR v2026.10.4 Δ
libmbedcrypto.a 71,435 71,467 -32 (-0.0%)
libmbedtls.a 46,018 45,915 +103 (+0.2%)
libmbedx509.a 7,084 7,084 ±0
libesp-tls.a 6,693 6,693 ±0
libesp_https_server.a 1,552 1,552 ±0

lwIP / HTTP / WebSocket — 126,572

Part This PR v2026.10.4 Δ
liblwip.a 78,237 78,241 -4 (-0.0%)
libhttp_parser.a 10,346 10,350 -4 (-0.0%)
libesp_http_server.a 10,100 10,096 +4 (+0.0%)
libtcp_transport.a 8,197 8,197 ±0
libespressif__esp_websocket_client.a 6,838 6,838 ±0
libesp_http_client.a 6,614 6,614 ±0
libesp_netif.a 6,240 6,236 +4 (+0.1%)

fos_ firmware shell (C)* — 126,160

Part This PR v2026.10.4 Δ
fos_http.c.obj 22,185 22,016 +169 (+0.8%)
fos_cloud.c.obj 18,385 18,042 +343 (+1.9%)
fos_console.c.obj 13,600 13,600 ±0
fos_client.c.obj 11,681 11,581 +100 (+0.9%)
fos_scenes.c.obj 7,090 7,571 -481 (-6.4%)
fos_settings.c.obj 6,570 6,994 -424 (-6.1%)
fos_ota.c.obj 5,031 5,191 -160 (-3.1%)
fos_cloud_contract.c.obj 4,648 4,648 ±0
fos_config.c.obj 4,458 4,458 ±0
fos_wifi.c.obj 3,201 3,201 ±0
fos_assets.c.obj 3,124 3,124 ±0
fos_sd_probe.c.obj 2,753 2,753 ±0
fos_schedule.c.obj 2,602 2,602 ±0
fos_assets_sd.c.obj 2,484 2,484 ±0
fos_buttons.c.obj 2,195 2,195 ±0
fos_status_screen.c.obj 2,049 2,049 ±0
fos_events.c.obj 1,941 1,941 ±0
main.c.obj 1,695 1,679 +16 (+1.0%)
fos_config_parse.c.obj 1,467 1,467 ±0
fos_url_guard.c.obj 1,397 1,397 ±0
fos_tz.c.obj 1,294 1,381 -87 (-6.3%)
fos_battery.c.obj 1,140 1,140 ±0
fos_minisig.c.obj 1,140 1,140 ±0
fos_commands.c.obj 940 — +940
fos_backend_http.c.obj 761 — +761
fos_scene_state.c.obj 650 — +650
fos_framebuffer.c.obj 483 483 ±0
fos_assets_path.c.obj 259 259 ±0
fos_power.c.obj 241 241 ±0
fos_battery_filter.c.obj 214 214 ±0
fos_wake.c.obj 184 184 ±0
fos_board.c.obj 179 179 ±0
fos_json_guard.c.obj 119 119 ±0

libc / libm / newlib — 116,259

Part This PR v2026.10.4 Δ
libc.a 76,459 76,459 ±0
libm.a 31,567 31,567 ±0
libnewlib.a 6,609 6,609 ±0
libstdc++.a 1,480 1,480 ±0
libgcc.a 98 98 ±0
libcxx.a 46 46 ±0

Storage (SPIFFS / FatFS / SD / NVS) — 94,044

Part This PR v2026.10.4 Δ
libspiffs.a 20,380 20,380 ±0
libfatfs.a 20,133 20,133 ±0
libspi_flash.a 14,168 14,168 ±0
libnvs_flash.a 13,665 13,665 ±0
libsdmmc.a 13,005 13,005 ±0
libvfs.a 6,196 6,196 ±0
libesp_driver_sdspi.a 3,854 3,854 ±0
libesp_partition.a 1,960 1,960 ±0
libesp_vfs_console.a 678 678 ±0
libnvs_sec_provider.a 5 5 ±0

Nim packages (chrono, zippy, chroma, qrgen, ...) — 71,909

Part This PR v2026.10.4 Δ
QRgen 3.1.0 22,040 22,040 ±0
chrono 0.3.1 15,562 15,538 +24 (+0.2%)
zippy 0.10.19 15,308 15,288 +20 (+0.1%)
chroma 1.0.0 14,710 14,706 +4 (+0.0%)
checksums 0.2.1 3,371 3,371 ±0
flatty 0.3.4 533 533 ±0
jsony 1.1.5 272 272 ±0
bumpy 1.1.3 113 113 ±0

Display drivers (C) — 64,938

Part This PR v2026.10.4 Δ
(everything else) 21,278 21,282 -4 (-0.0%)
frameos_panel_table.c.obj 6,685 6,685 ±0
EPD_13in3e.c.obj 1,792 1,792 ±0
EPD_3in7.c.obj 1,564 1,564 ±0
EPD_5in79.c.obj 1,481 1,481 ±0
DEV_Debug.c.obj 1,309 1,309 ±0
EPD_2in7.c.obj 1,292 1,292 ±0
EPD_4in2.c.obj 1,262 1,262 ±0
EPD_7in3e.c.obj 1,216 1,208 +8 (+0.7%)
DEV_Config_esp.c.obj 1,184 1,180 +4 (+0.3%)
EPD_4in2_V2.c.obj 1,184 1,184 ±0
EPD_4in26.c.obj 1,123 1,123 ±0
29 smaller rows 23,568 23,572 -4 (-0.0%)

Crypto (monocypher) — 35,165

Part This PR v2026.10.4 Δ
monocypher.c.obj 31,884 31,960 -76 (-0.2%)
monocypher-ed25519.c.obj 3,281 3,285 -4 (-0.1%)
Biggest movers (per object)
Object Δ This PR Baseline
embedded_runtime.nim +2,798 16,897 14,099
fos_scenes.c.obj -481 7,090 7,571
frameos/interpreter.nim -426 100,288 100,714
fos_settings.c.obj -424 6,570 6,994
fos_cloud.c.obj +343 18,385 18,042
esp_efuse_utility.c.obj +308 133,523 133,215
fos_http.c.obj +169 22,185 22,016
frameos/single_scene_host.nim +163 6,553 6,390
fos_ota.c.obj -160 5,031 5,191
frameos/utils/asset_colors.nim +154 17,585 17,431
frameos/utils/font.nim -130 5,607 5,737
frameos_nim_glue.c.obj +112 10,421 10,309
fos_client.c.obj +100 11,681 11,581
ssl_tls.c.obj +91 7,488 7,397
monocypher.c.obj -76 31,884 31,960
Largest 30 objects
Object Subsystem This PR v2026.10.4 Δ
quickjs.c.obj QuickJS 283,653 283,637 +16 (+0.0%)
assets/fonts.nim Embedded font 146,370 146,358 +12 (+0.0%)
esp_efuse_utility.c.obj String pool (attributed to efuse) 133,523 133,215 +308 (+0.2%)
frameos/interpreter.nim FrameOS core (Nim) 100,288 100,714 -426 (-0.4%)
nim/lib/pure/collections/tables.nim Nim stdlib 72,023 71,982 +41 (+0.1%)
frameos/js_runtime/app_runtime.nim FrameOS core (Nim) 62,120 62,142 -22 (-0.0%)
pkgs/pixie-6.1.0/pixie/fontformats/opentype.nim pixie 55,542 55,543 -1 (-0.0%)
libunicode.c.obj QuickJS 50,186 50,194 -8 (-0.0%)
nim/lib/system.nim Nim stdlib 48,433 48,467 -34 (-0.1%)
apps/data/icalJson/ical.nim FrameOS apps (Nim) 44,588 44,588 ±0
pkgs/pixie-6.1.0/pixie/fileformats/webp.nim pixie 37,509 37,521 -12 (-0.0%)
pkgs/pixie-6.1.0/pixie/fileformats/svg.nim pixie 37,039 37,047 -8 (-0.0%)
frameos/utils/image.nim FrameOS core (Nim) 36,025 36,089 -64 (-0.2%)
pkgs/pixie-6.1.0/pixie/paths.nim pixie 32,570 32,570 ±0
monocypher.c.obj Crypto (monocypher) 31,884 31,960 -76 (-0.2%)
frameos/js_runtime/runtime.nim FrameOS core (Nim) 30,245 30,224 +21 (+0.1%)
pkgs/pixie-6.1.0/pixie/fileformats/jpeg.nim pixie 25,330 25,330 ±0
apps/render/calendar/app.nim FrameOS apps (Nim) 23,661 23,657 +4 (+0.0%)
pkgs/pixie-6.1.0/pixie/fileformats/png.nim pixie 22,841 22,841 ±0
fos_http.c.obj fos_* firmware shell (C) 22,185 22,016 +169 (+0.8%)
embedded_main.nim FrameOS core (Nim) 19,215 19,227 -12 (-0.1%)
apps/render/chart/app.nim FrameOS apps (Nim) 18,908 18,924 -16 (-0.1%)
fos_cloud.c.obj fos_* firmware shell (C) 18,385 18,042 +343 (+1.9%)
frameos/utils/status_screen.nim FrameOS core (Nim) 17,979 17,999 -20 (-0.1%)
x509_crt_bundle.S.obj mbedTLS + certificates 17,928 17,928 ±0
frameos/utils/asset_colors.nim FrameOS core (Nim) 17,585 17,431 +154 (+0.9%)
nim/lib/pure/unicode.nim Nim stdlib 17,405 17,405 ±0
nim/lib/pure/times.nim Nim stdlib 16,970 16,984 -14 (-0.1%)
embedded_runtime.nim FrameOS core (Nim) 16,897 14,099 +2,798 (+19.8%)
lib/tz.nim FrameOS core (Nim) 16,738 16,735 +3 (+0.0%)

Flash = .text + .rodata from the linker map via esp_idf_size; "Inside each subsystem" splits every bucket one level down (the Nim core by directory, apps by app, packages by package, ESP-IDF by archive) over all objects, not just the largest. "String pool (attributed to efuse)" is the linker's merged string-literal pool for the whole image, not efuse code — see docs/esp32-image-size.md.

mariusandra and others added 2 commits October 11, 2026 18:36
The settings pull, the scenes pull, the commands pull, the tz slice lookup
and the OTA manifest each set up esp_http_client by hand: the bearer
header, the optional If-None-Match, the bounded read into a malloc'd
buffer, the close and cleanup on every exit. fos_backend_http.c is the one
copy (and the one place that reads a chunked body by growing up to the
cap, in PSRAM where the board has it); the five callers keep only what
they do with the answer. The streams stay as they are: the remote-render
bitmap, the OTA image and the image push.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… scene it leaves

On top of #527's fix (an event builds the current scene when it arrives
before the first render): a setCurrentScene is the one event the
dispatcher serves without a scene, and the backend queues exactly that
for a frame's wake — building the scene being left first is seconds of
JavaScript transpiling for a scene nobody sees. The host-differences table
in docs/events.md gets the row.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@mariusandra
mariusandra merged commit d28f4ef into main Oct 11, 2026
19 checks passed
@mariusandra
mariusandra deleted the esp32-http-helper branch October 11, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant