Repository navigation
ESP32: one HTTP client for the pulls; a wake's scene switch skips the scene it leaves - #528
Conversation
a4dac2d to
c614f30
Compare
ESP32 firmware sizeBuilt from a398a62 by this run; compared with the latest release v2026.10.4.
Breakdown by subsystem —
|
| 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.
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>
c614f30 to
a5bb7b9
Compare
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_clientby hand.fos_backend_http.cis the one copy: bearer header, optionalIf-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.candfos_scenes.close their privateread_bodyand 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):
setCurrentSceneis the one event the dispatcher serves without a scene, and the backend queues exactly that for a frame's wake (set_current_sceneon the command queue). Building the scene being left first is seconds of JavaScript transpiling for a scene nobody sees. A case intest_single_scene_host.nimpins it, anddocs/events.md"Known host differences" gets the row.One thing to keep an eye on with #527's approach, not changed here:
sendruns on whatever task sent the event, so a cloudscene_eventor an HTTP/eventthat 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
build_nim.sh+idf.py buildfor esp32-s3 (32 MB profile), no errors or warnings in the changed files.test_single_scene_host.nim(ESP32: the button that wakes a frame reaches its scene; E1004 button labels #527's plus the new case) andtest_event_loop.nimpass.test_embedded_firmware.pyand the ESP32 host tests pass.🤖 Generated with Claude Code