尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证128x64 LED panel for aircraft overhead, clock, weather, departures and Spotify. ESP32-S3 firmware, PHP server
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗THE WALL is an LED panel for the living room. It measures 32 by 16 centimetres and has 8,192 pixels. When a plane passes over, it shows the airline, the route, the aircraft type, and how high and fast it flies. It was built in Luxembourg for two devices and works anywhere adsb.lol receives aircraft.
The device itself stays simple. Every ten seconds it asks the server what to draw and gets back a short list of drawing commands. New display modes are written on the server and need no new firmware, and no credential for an outside service ever ends up on the device.
| Part | State |
|---|---|
| Server and website | Running since September 2026 at thewall.godart.lu, code in web/ |
| Device interface | Documented and tested in docs/server/geraet.md, the firmware is built against it |
| Firmware | Runs on the board since 14 September 2026: boot and status animations, setup network with its own page, polling the server, the onboard clock chip. Since version 0.1.2 every update has arrived over the air. Both devices run 0.2.2, which draws the segment clock in the clock's own colour. 0.3.0 from 12 October 2026 lets a device without an account show its own clock, message or scrolling text and run timer, alarm and night dimming from its setup page; it is built and its page tested against a mock, but it has not run on a device yet. 0.2.1 from 26 September 2026 added sound for timers and the alarm; the sound has not been heard on a device yet. Details in firmware/ |
| Stand | Designed in OpenSCAD and printed once. After the first fit the slot is 1 mm wider and the front lip covers 1.5 mm instead of 14. The board sits landscape on four printed snap-fit pins on the right foot, no screws |
The instance at thewall.godart.lu runs two devices and takes new accounts by invitation only. To build your own wall, host the server yourself, it takes one PHP host and a database.
| Flight, departure and arrival. Both are estimates from distance and speed, marked with a tilde because they are. | Flight, position. The place under the aircraft, from OpenStreetMap. |
| Flight, metrics. Callsign, distance, type, altitude in thousands of feet, speed in km/h, track and vertical rate. | Flight, route. Airline, route and the aircraft type written out, 737 MAX 8 rather than B38M. |
| Clock. Three digit faces or the resting screen from the flight radar, 12 or 24 hours, with an optional weather line. | Weather. Current conditions or three days ahead, from Open-Meteo. |
Flight radar. The nearest aircraft within 5 to 150 nautical miles. Four views take turns every 2 seconds to 2 minutes: route, departure and arrival, position, metrics. After each dwell time (3 to 60 seconds) the server looks again and switches when another aircraft is closer. Altitude, speed, climb and distance come in the units you pick (feet or metres, km/h, knots or mph, m/s or ft/min, nautical miles, km or miles). Overflights above 30,000 feet can be hidden, military aircraft get their own colour, and a single flight can be pinned by flight number, callsign or registration, anywhere in the world: the panel then follows that one flight, what it is flying over, when it left and when it lands. When the sky is empty the panel shows the clock, a waiting animation or a quiet resting screen.
Clock and weather. The time comes from the device's own clock, the server only sends the time zone. Weather is refreshed every 15 minutes, in Celsius or Fahrenheit, with wind if you want it.
Notes. Two lines of 21 characters, sent from the website. A new note blinks three times and stays in front for ten minutes. Guests with view-only access may send notes too, and nothing else.
Countdown. A name and a date, optionally a time. The panel counts the days in the device's time zone and says TODAY on the day. With a time, the last hour shows the minutes, and the device counts the seconds itself (from firmware 0.2.0); at zero it shows NOW inside an amber frame for ten minutes. After that the days since, in grey, and it stays in the rotation for 30 more days. Nothing flashes.
Ticker. Up to 200 characters scrolling across a band, at three speeds, in a colour you pick, with the clock and date above it if you like. The device keeps the scroll going by its own clock, so a page change does not make it jump.
Departures. Up to three stops from the OpenAPI of the Administration des transports publics (mobiliteit.lu): buses, trains and trams on one board. Minutes by default or the clock, the delay shows as colour, markers for cancelled, partly cancelled, additional and replacement services, and notes run along the bottom. Stops mixed on one board take turns, so a station shows its train and not only four buses. Stops are picked on a map of every stop in the country, with search by village or stop name. When the mode comes round in the rotation, the rows drop in one by one. Needs a personal key from the ATP, saved encrypted in the admin area.
Spotify. What plays in your own Spotify account: cover, title, artist and album, below a time bar the device counts on its own. Four layouts: classic, large cover, colours from the cover, and a record that turns behind the sleeve. Ten seconds before the end the next track is announced one line lower, then a reel rolls it in; skipping on the phone spins a carousel instead. Album, up next and cover only can join in turn. Each account connects its own Spotify on the device page, nothing is controlled. Needs firmware 0.2.0 and an app in the Spotify dashboard, whose credentials go into the admin area.
Timers and alarm. Timers are started on the website or from Home Assistant, up to five at once. While one runs, every mode shows the time left in a corner, top right in most modes; the flight mode then cuts line 1 to nine characters and gives the full name back once the timer is gone. When it runs out, the whole panel says so until someone stops it, at most 15 minutes. One alarm per device with time and weekdays, in the device's time zone. From firmware 0.2.1 the device beeps through the speaker, rings the alarm without internet and stops on a press of the wheel.
Rotation. Flight, clock, weather, departures, Spotify, countdown and ticker take turns, each for 10 seconds to 10 minutes, 30 seconds unless set otherwise; Spotify only while music plays, the countdown until 30 days after its date, the ticker with text. Brightness is set on the website and can drop to 35 percent of that value between sunset and sunrise. A switch on the device page reduces motion on the panel: no sliding, no blinking, text stands still.
The panel pictures in this README are rendered by tools/panel-png.mjs from the same drawing commands the device receives. The flight pictures show the demo flight from the start page, the place under it is a real answer from OpenStreetMap. Airline logos are not part of this repository, so these pictures show a coloured block with the ICAO code instead.
homeassistant/, for HACS at LennyGodart/THE-WALL-HA: the panel as a light, the mode as a select, notes as notifications, timers, the alarm and the flight on the panel as sensors. Home Assistant finds the device on the home network (firmware 0.2.1), and pairing takes a six-character code that appears on the panel. Each pairing covers one device and gets its own key.flowchart LR
wall["THE WALL<br/>ESP32-S3 and LED panel"]
browser["Browser"]
subgraph server["Server: PHP and MariaDB"]
api["/api/v1/frame"]
site["Website"]
cache[("Cache")]
end
subgraph services["Data services"]
adsb["adsb.lol and adsb.fi<br/>aircraft"]
vrs["VRS standing data<br/>routes"]
adsbdb["adsbdb<br/>airline names"]
meteo["Open-Meteo<br/>weather"]
osm["Nominatim<br/>place search"]
atp["mobiliteit.lu<br/>departures"]
end
wall -- "GET every 10 s" --> api
api -- "drawing commands" --> wall
browser -- "settings and preview" --> site
api --- cache
site --- cache
cache --> adsb
cache --> vrs
cache --> adsbdb
cache --> meteo
cache --> osm
cache --> atp
The device always asks, the server never pushes. That works behind every home router without port forwarding. Between the full requests every ten seconds it asks every two seconds for a revision number, so a change on the website reaches the panel in about two seconds. Each answer covers the next 25 seconds as pages with fixed time windows, so two answers fit together without a jump. A page is a list of commands, and the firmware knows fourteen of them: text, ticker, rect, bar, frame, logo, clock, date, anim, since 0.1.9 bmp and dot for the map, since 0.2.0 prog, count and disc for Spotify.
A route only counts when it fits the aircraft. Both route sources know one route per callsign, but no date: the same callsign flies the return leg in the afternoon, and in the US often a different route on another day. So the server checks position, altitude, climb and track against each leg before it shows a departure, a destination or an arrival time. Measured on 24 September 2026 over nine airports in the US and Europe, 268 of 286 routes from the VRS standing data fitted, and every rejected one was a different flight.
{"from": 1789289999000, "to": 1789290008000, "id": "flight", "ops": [
{"t": "logo", "code": "LGL", "x": 2, "y": 2},
{"t": "text", "x": 38, "y": 2, "s": "LUXAIR", "c": "FFAA00"},
{"t": "bar", "x": 0, "y": 61, "w": 79, "c": "3DE07C"}
]}
The server shortens every line to 21 characters and replaces umlauts before sending. A new mode is a PHP file in web/.htapp/modes/ and costs the firmware nothing. The flash is not the reason for this design: the board has 16 MB. The reasons are modes without reflashing, one cached request per location instead of one per device, and no credentials in a firmware that anyone can read out.
| Part | Where | Price (Sept. 2026) |
|---|---|---|
| Ocnvlia P2.5 LED panel, 128 × 64 pixels, 320 × 160 mm, HUB75E | Amazon B0H1MPC9YZ | 43.63 € |
| SEENGREAT RGB Matrix HUB75 S3 V1.0 with ESP32-S3-WROOM-1-N16R8 (16 MB flash, 8 MB PSRAM), microSD, RTC, audio | Amazon B0H69TFHJ7 | 35.88 € |
Stand, two printed feet from hardware/standfuss/ | your printer | about 1 € of filament |
| USB-C phone charger, 5 V and 3 A |
Power goes into the board through the socket marked USB-C, the board passes 5 V on to the panel with the cable in the box. The second socket, POWER, stays empty. The panel uses an FM6126A driver chip and stays dark unless the firmware sets mxconfig.driver = HUB75_I2S_CFG::FM6126A;, even with every pin right. Pin assignment, driver notes and the measurements for the stand are in hardware/README.md (German).
You need a web server with PHP 8.5 (pdo_mysql, curl, sodium, mbstring, openssl, and for accents, album covers and the detailed map also intl, gd and zlib), MariaDB, and an SMTP account for mail. No framework, no Composer, no build step, no cron job.
web/ into the web root. Everything that is not a file goes to index.php, and everything under /.ht must be blocked:
location / { try_files $uri $uri/ /index.php?$args; }
location ~ /\.(ht|svn|git) { deny all; }
Apache uses the included .htaccess files..htdata/config.php from web/.htapp/config.example.php with your address and database login.https://<your-domain>/account once. While there is no account yet, this creates .htdata/secret.php and sets up the database.setup_token from .htdata/secret.php and open https://<your-domain>/account?mode=register&setup=<token>. The first account becomes admin.To try it locally with SQLite, run bash tools/dev-server.sh and open http://127.0.0.1:8765. Details on hosting, backups and mail are in docs/server/betrieb.md.
Logos are registered trademarks of their airlines and are not in this repository. node tools/logos-build.mjs downloads the collection Jxck-S/airline-logos, turns each logo into 32 × 34 full-colour LED pixels, and writes one file per ICAO code for your own server's .htdata/logos/. Without a file the panel shows a grey block with the code.
The first firmware goes onto the board over USB, every later one over Wi-Fi. Upload the app binary (firmware.bin) in the admin area, or put it on the server as .htdata/firmware/thewall-<x.y.z>.bin. The server reads the version from the file itself, finds it on the next request, computes its SHA-256 and offers it to devices that report a lower version in X-Wall-Fw. In the admin area you choose which share of devices gets it, and whether they update on their own or only after the owner presses Update now. The full sequence, including what the device has to check before it reboots, is in docs/server/betrieb.md.
| Path | Contents |
|---|---|
web/ | Server and website, copied 1:1 into the web root |
docs/server/ | Documentation of every file and function, the device interface, operations (German) |
docs/images/ | The pictures in this README |
hardware/ | Parts, pins, stand as OpenSCAD and STL |
firmware/ | Firmware for the ESP32-S3 board, built with PlatformIO |
homeassistant/ | The Home Assistant integration, MIT, also published as THE-WALL-HA |
tools/ | Node scripts without dependencies: local server, panel renderer, logo builder, checks |
CLAUDE.md | Project rules for design, text, accessibility and architecture (German), read by Claude Code |
CONTRIBUTING.md | How to contribute, run everything locally and test it |
Node 18 or newer, no packages. Run from the repository root.
| Command | Purpose |
|---|---|
bash tools/dev-server.sh | Website on http://127.0.0.1:8765 with SQLite |
node tools/panel-png.mjs frame.json out.png | Renders an answer of /api/v1/frame as PNG, a reference for the firmware |
node tools/logos-build.mjs | Builds the airline logos for your server |
node --max-old-space-size=4096 tools/geo-welt.mjs | Rebuilds the world map data for the panel from Natural Earth and OurAirports |
node tools/fwdemo.mjs [email protected] | Fetches the four nearest aircraft around Luxembourg City from adsb.lol and adsbdb |
node tools/fontcmp.mjs web/assets/js/lib/pixelfont.js tools/font95.hex | Compares the pixel font with the default font of the panel library |
node tools/audit.mjs <folder> | Checks saved pages against the rules in CLAUDE.md |
node hardware/vol.mjs | Filament needed for the STL files |
THE WALL was designed and written together with Claude, the AI model by Anthropic. The website, the emails and the panel animations were designed in Claude Design. The server, the website code, the tools and the documentation were written with Claude Code, following the rules in CLAUDE.md, which stays in the repository for anyone who wants to continue the same way.
Lenny Godart decided what to build and how it should behave, and checked the results on the running site. Before any hardware existed, the device interface was tested live with a client that sends the same requests as the firmware will. The firmware was made the same way and has run on the board since 14 September 2026.
web/assets/vendor/leaflet/tools/font95.hex: characters 32 to 126 of glcdfont.c from Adafruit GFX, BSD licenseFlight, weather and transport data come from third parties and can be wrong, late or incomplete. Do not use them for navigation or for any decision in aviation.
Code (web/, tools/, firmware/) is under the MIT License with the Commons Clause: use it, change it, build your own wall and share your changes, but do not sell it, not as a product, a finished device or a paid service. The Home Assistant integration in homeassistant/ is under the plain MIT License. Documentation (docs/, both README files) and hardware (hardware/) are under CC BY-NC-SA 4.0. Third-party parts keep their own licenses, listed above.
Strictly speaking this makes THE WALL source-available rather than open source: everything can be read, built and changed, only selling is excluded. Contributions are welcome, see CONTRIBUTING.md.