Testers said the colour was what set wadamesh apart, and the beta_89 redesign took most of it out. This puts it back as choices on one new page. Settings > Theme (CAT_THEME, Device group): a live preview drawn from a copy of the palette (themeTokensFor), Night/Day cards, High contrast, the accent swatches inline with Custom, MORE COLORS! with Regular/Neon/Pastel, Taste the rainbow, and the chat looks. Mode, accent and look are pending until one Apply and restart on the preview box; scrolled past it, a slim bar under the title carries the button with six dots in the picked look. Chat icons, bubbles and compact apply live. The look rows left Display; the control panel's theme chip long-press opens Theme. The colour engine: ThemeTokens + lookAdjust over the mode and accent at boot (applyBootTheme), section hues for the launcher, Settings, tab bar and status icons, per-name colours (FNV hue) for names, glyphs, initials balls and bubble tints, Neon lit edges and gradient primaries, Pastel tints, and a deeper Day ink for names and glyphs on light lists. MORE COLORS! defaults on (Regular); HC and e-paper keep their own colours. New prefs are standalone u8 keys (chat_icons, col_more, col_style, col_rb), no schema bump. Taste the rainbow: per-item hues round the wheel, a 10 Hz hue drift on the tab marker, chats count and focus ring (rests when off, locked or screensaver), press dip, an arrival flash on new bubbles (draw-only props, the virtual list never sees it), rainbow lock mark, boot mark and Constellation nodes (CstTheme node_sat/node_val), and a dot burst on enabling it. Chat icons: Glyphs or Initials through one avatarApplyLook; AVATAR_SQUARE_FLAG moved off LV_OBJ_FLAG_USER_1, which is the nav's NAV_SKIP_FLAG. Size: wadamesh_mark_rgb.h was a static array included by main.cpp and UITask.cpp, so every S3 image carried the 30 KB boot mark twice. One definition now (UITask.cpp; the P4 never compiles main.cpp). The V4 goes from overflowing to ~30 KB free with all of the above. Capture tour: wakes and ends the screensaver before shooting, DOC_LOOK forces a look, DOC_LOOK_AUDIT walks the looks and the Theme page, DOC_MAP_SHOT waits for Wi-Fi and for every tile before shooting the map. 25 new strings as English placeholders in every .lang file. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
wadamesh.com infrastructure
Distribution stack for wadamesh: a VPS nginx origin behind Cloudflare.
tiles.wadamesh.com →CF (HTTP, edge-cached) → nginx → OpenStreetMap / OpenTopoMap
firmware.wadamesh.com →CF (cache bins) → nginx → /srv/wadamesh/firmware
flasher.wadamesh.com →CF (HTTPS) → 301 → wadamesh.com
wadamesh.com →CF (HTTPS) → nginx → /srv/wadamesh/site
Map tile styles. The default /{z}/{x}/{y}.jpg route serves OpenStreetMap
(the firmware default). An opt-in OpenTopoMap topographic style is served from
/opentopo/{z}/{x}/{y}.jpg (explicit OSM alias at /osm/...); the device requests
it only when the user enables Map → Options → Topographic map. Legal: OpenTopoMap
map tiles are © OpenTopoMap (CC-BY-SA) over © OpenStreetMap contributors
(ODbL) + SRTM — the touch UI shows that attribution when topo is active, and the
14-day disk cache keeps each tile hitting OpenTopoMap at most once per fortnight
(their tile-usage policy asks for a contactable UA + caching, both of which the
transcode service provides). Deploying the topo routes = update
tiles.wadamesh.com.conf + tile-transcode.py, then
systemctl restart wadamesh-tile-transcode && nginx -t && systemctl reload nginx
and purge the Cloudflare cache for tiles.wadamesh.com/opentopo/*.
The firmware fetches tiles + the update-check over plain HTTP (on-device HTTPS isn't viable — mbedTLS needs ~30 KB heap, only ~5 KB is free post-Wi-Fi), so the tile + firmware hosts must stay reachable over HTTP. Cloudflare provides the edge cache, HTTPS for the flasher, and hides the origin IP (so no IP lives in this repo or the firmware).
1. VPS (origin)
sudo apt install nginx
sudo mkdir -p /srv/wadamesh/firmware/releases/TOUCH /var/cache/nginx/wadamesh-tiles
sudo cp deploy/nginx/tiles.wadamesh.com.conf /etc/nginx/sites-available/
sudo cp deploy/nginx/firmware.wadamesh.com.conf /etc/nginx/sites-available/
sudo ln -s /etc/nginx/sites-available/tiles.wadamesh.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/firmware.wadamesh.com.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
2. Cloudflare
- DNS:
A/AAAArecords fortiles,firmware,flasher,@→ the VPS IP, all Proxied (orange cloud). - SSL/TLS: mode Flexible (CF↔origin HTTP) is enough since the origin is
HTTP-only. Do NOT enable "Always Use HTTPS" on
tiles.orfirmware.— the firmware needs plain HTTP there. - Cache Rules:
tiles.wadamesh.com/*→ Eligible for cache, Edge TTL ~14d.firmware.wadamesh.com/releases/*/*.bin→ cache, Edge TTL ~1d.firmware.wadamesh.com/releases/TOUCH(the listing) → short TTL (~60s) or Bypass, so new releases appear promptly.
3. Publishing a release
From a wadamesh checkout (builds both boards, refreshes the listing, rsyncs up):
WADAMESH_VPS=user@your-vps scripts/release.sh beta_2
The on-device check GETs http://firmware.wadamesh.com/releases/TOUCH, finds the
highest beta_<N>, and (once OTA-over-Wi-Fi is re-enabled) pulls
…/releases/TOUCH/beta_<N>/<board>.bin.
Done
- Web flasher ✅ — the guided install page at
wadamesh.com, served fromdeploy/site/and published byscripts/deploy-site.sh(esp-web-tools / Web Serial, per-board install buttons + .bin downloads, manifests generated per release byscripts/build/gen-flasher-meta.pyinto the/latest/and/latest-beta/feeds thatrelease.shrefreshes each publish). flasher.wadamesh.com301-redirects to the apex (seedeploy/nginx/flasher.wadamesh.com.conf) — it is an alias, not its own page.deploy/flasher/is the original standalone flasher page. No deploy script publishes it —deploy-site.shshipsdeploy/site/only — so it is effectively an offline/local copy kept in parity by hand. Retire it or wire it into a deploy target; until then, treatdeploy/site/index.htmlas the only install page users can reach.
TODO before public launch
- Re-enable OTA-over-Wi-Fi in the firmware (currently it version-checks then defers to manual flashing).
- Flip
wadameshrepo public = launch. - Decide tile-proxy sharing: dedicated
tiles.wadamesh.com(this config) vs reusing the meshcomod proxy.
Never commit the VPS IP, SSH keys, or
WADAMESH_VPS. Cloudflare fronts the origin; the deploy target is supplied via the environment at publish time.