Home Reference Project and Build
Reference

Project and Build

Current project files, `frothy init`, library manifests, build output, and flashing policy.


Most beginners do not need a project on the first day. A prompt and a .fr file are enough. Projects matter when you want repeatable files, libraries, firmware builds, or native extension code.

Project Shape

Create a folder and initialize it:

mkdir my-sketch
cd my-sketch
frothy init

That creates:

frothy.toml
main.fr
.gitignore
libs/

A minimal manifest looks like:

name = "blink"
target = "esp32_devkit_v1"

esp32_devkit_v1 is the board identifier Frothy currently uses for the development ESP32 shape.

Send A File

frothy send main.fr --port /dev/cu.usbserial-0001
frothy send main.fr --dry-run

Build And Flash

frothy build
frothy flash esp32_devkit_v1 --port /dev/cu.usbserial-0001

Do not flash after every small change. The ordinary loop is connect, send, inspect, revise.

Libraries

name = "stage-lights"
target = "esp32_devkit_v1"

[deps]
servo = { path = "libs/servo" }

Remote dependency fetching is not ready yet.

Native Extensions

name = "neopixel"
version = "0.1.0"
targets = ["esp32_devkit_v1"]

[extension]
sources = ["native/neopixel.c"]

[[natives]]
name = "neopixel.show"
arity = 1
c_function = "fr_lib_neopixel_show"

This is not dynamic plugin loading. The C files are compiled into the firmware build, and the generated native table gives Frothy named words that call those C functions.

Generated build files live under .frothy/build/.... Treat them as derived state, not source you edit by hand.