▶ Try the live web UI demo — interactive, no hardware required
Temperature Control
- PID controller with auto-tuning (Ziegler-Nichols relay method)
- 1-second control loop with time-proportional SSR output
- Thermocouple calibration offset
Firing Profiles
- Up to 20 custom profiles with 16 segments each (ramp rate, target temp, hold time)
- Orton cone firing (cones 022-13) with slow, medium, and fast heating speeds
- Delayed start
Safety
- Over-temperature protection (hardware max 1400 C, user-configurable limit)
- Thermocouple fault detection (open circuit, short to GND/VCC)
- Rate-of-rise monitoring (detects runaway >2x programmed rate)
- Not-rising detection (alerts if <10 C rise in 15 min)
- Emergency stop with immediate SSR cutoff
Web Dashboard
- Real-time temperature chart with profile overlay (React + Recharts)
- Profile builder with cone fire mode
- Firing history with CSV trace export and cost estimation
- Settings: calibration, safety limits, webhooks, API token
iOS App
- Full remote control (SwiftUI)
- Dynamic Island live activities during firing
- Local notifications for firing complete/error
LCD Display
- 3.5" TFT (480x320) with LVGL, adaptive single-screen dashboard (idle/active/paused/complete/error)
- 5-way nav switch (up/down/select/left/right), SELECT-driven modals for profile pick and firing control
Connectivity
- Wi-Fi with mDNS (
bisque.local) - REST API with optional bearer token auth
- WebSocket for real-time streaming
- Webhook notifications (firing complete/error)
Web Dashboard (React)
LCD Display (LVGL on 3.5" TFT)
iOS App (SwiftUI)
Expand
| Component | Description | Approx. Cost |
|---|---|---|
| ESP32-S3-DevKitC-1 (N16R8) | Main controller, 16MB flash, 8MB PSRAM (44-pin, USB-C) | ~$10 |
| MAX31855 breakout | K-type thermocouple amplifier (SPI) | ~$15 |
| K-type thermocouple | High-temp probe, kiln rated | ~$15-30 |
| ST7796S 3.5" TFT LCD | 480x320 SPI display | ~$12 |
| SSR (e.g. SSR-40DA) | Solid state relay for kiln element | ~$10 |
| 3x tactile buttons | Up / Down / Select navigation | ~$1 |
| Piezo buzzer (optional) | Alarm output | ~$1 |
| Relay module (optional) | Vent fan control | ~$3 |
Safety warning: Kilns operate at dangerous temperatures and voltages. Ensure all high-voltage wiring is performed by a qualified electrician. Use appropriate safety equipment and never leave a firing kiln unattended.
Expand
| Signal | ESP32-S3 GPIO |
|---|---|
| MOSI | 11 |
| MISO | 13 |
| SCLK | 12 |
| Signal | ESP32-S3 GPIO |
|---|---|
| CS | 10 |
| LCD Pin | ESP32-S3 GPIO | Notes |
|---|---|---|
| SDA | 11 | SPI MOSI (data to display) |
| SCL | 12 | SPI clock |
| CS | 9 | Chip select |
| DC | 46 | Data/Command |
| RST | 3 | Reset |
| BL | 8 | Backlight (active-high) |
| Signal | ESP32-S3 GPIO |
|---|---|
| SSR | 17 |
| Button | ESP32-S3 GPIO | Notes |
|---|---|---|
| Up | 4 | Active-low, internal pull-up |
| Down | 5 | Active-low, internal pull-up |
| Select | 6 | Active-low, internal pull-up |
See also: Wiring Diagram | Perfboard Layout
- ESP-IDF v6.0.1
- Node.js 18+
- XcodeGen (for iOS development)
# Build web UI assets first
cd web_ui && npm install && npm run build && cd ..
# Gzip assets for SPIFFS
gzip -k -9 spiffs_data/www/assets/*.js spiffs_data/www/assets/*.css
# Build and flash firmware
source ~/.espressif/v6.0.1/esp-idf/export.sh
idf.py build
idf.py flash monitorcd web_ui
npm install
npm run dev # Starts dev server with mock kiln simulator# Generate Xcode project
cd ios/Bisque
xcodegen generate
open Bisque.xcodeprojFor simulator testing, start the mock server first:
cd web_ui && npm run mock-server # HTTP + WebSocket on localhost:8080In the iOS simulator, tap "Use Mock Server" on the connection screen.
Simulator / Mock Server
A mock kiln server simulates the full API (status, profiles, firing, settings, history, autotune, diagnostics) with realistic temperature physics so you can develop and test without hardware.
The mock server runs automatically as a Vite plugin when you start the web UI dev server:
cd web_ui
npm run devThe mock is enabled by default. To disable it and proxy to a real kiln instead:
VITE_MOCK=false npm run devControl simulation speed with VITE_MOCK_SPEED (default 60 = 60x real-time):
VITE_MOCK_SPEED=120 npm run devA standalone mock server is available for testing the iOS app in the Xcode simulator:
cd web_ui
npm run mock-serverThis starts an HTTP + WebSocket server on localhost:8080. To change the port or simulation speed:
MOCK_PORT=9000 MOCK_SPEED=120 npm run mock-serverA standalone SDL2-based simulator renders the LVGL display UI on your desktop:
cd simulator
cmake -B build && cmake --build build
./build/bisque_simRequires SDL2 (brew install sdl2 on macOS).
main/ App entry point, FreeRTOS task creation
components/
app_config/ Pin definitions, hardware constants
thermocouple/ MAX31855 SPI driver
pid_control/ PID controller + Ziegler-Nichols auto-tune
firing_engine/ Multi-segment firing state machine
safety/ Watchdog, over-temp, fault detection
cone_table/ Orton cone temperature lookup (022-13)
history/ Firing history + temperature traces (NVS)
display/ ST7796S LCD + LVGL UI (adaptive dashboard)
web_server/ REST API + WebSocket server
wifi_manager/ Wi-Fi STA/AP + mDNS
web_ui/ React/TypeScript web dashboard
ios/Bisque/ SwiftUI iOS app
simulator/ LVGL SDL2 desktop simulator
tests/host/ Pure-logic + accelerated firing unit tests (CMake/Unity)
docs/ Wiring diagrams, screenshots, bench smoke test
CI runs five automated test layers on every PR — pure-logic unit tests
and accelerated firing scenarios (tests/host/), a UI screenshot
regression suite (simulator/ --diff), web UI unit tests, and a
cross-language API contract test that validates firmware JSON output
against the frontend's zod schemas.
Before tagging a release, run the bench smoke test — a 3-8 minute hardware run that verifies the parts CI can't touch: real SSR clicks, real thermocouple readings, history persistence across reboot.
Firmware is distributed as GitHub Releases, each with a full ESP32-S3 flash kit and Sigstore build-provenance attestations. See RELEASING.md for the versioning scheme and the procedure for cutting a release.












