PebbleOS is the operating system running on Pebble smartwatches.
docs: project documentationpython_libs: tools used in multiple areas, e.g. log dehashing, console, etc.resources: firmware resources (icons, fonts, etc.)sdk: application SDK generation filessrc: firmware sourcetests: teststhird_party: third-party code in git submodules, also includes glue codetools: a variety of tools or scripts used in multiple areas, from build system, tests, etc.waftools: scripts used by the build system
- clang-format for C code
- ruff for Python code
- Keep code comments short and concise. Extended descriptions can be kept in the Git commit message.
- Do not put references to issues in the code, only add those to the Git commit message.
PBL_LOG_WRN/PBL_LOG_ERRare for warnings and errors — use them as the names suggest.- Default to
PBL_LOG_DBGfor routine lifecycle / state-transition logs. ReservePBL_LOG_INFOfor events that genuinely warrant attention in a default-level log capture; if a code path can fire repeatedly under normal use (e.g. play/pause spam, frequent state changes), it must not log at INFO.
-
Configure:
./pbl configure --board BOARD_NAME- Board names can be obtained from
./pbl --help -DCONFIG_RELEASE=yenables release mode--mfgenables manufacturing mode--variant=normal|prfselects build variant (default: normal)
- Board names can be obtained from
-
Build firmware:
./pbl build -
Run tests:
./pbl test
When exposing a new function to third-party apps (i.e. anything declared
in an applib/ header that user apps can call), three things must change
together — the firmware build alone won't surface it to apps:
- Implement the applib wrapper and syscall — add the function to the
appropriate
src/fw/applib/.../<area>.c/.h, declare the syscall insrc/fw/syscall/syscall.h, and define it withDEFINE_SYSCALLinsrc/fw/syscall/syscall_<area>.c. - Register the symbol in
tools/generate_native_sdk/exported_symbols.jsonunder the matching group, with anaddedRevisionmatching the new SDK revision. - Bump the SDK revision in
src/fw/process_management/pebble_process_info.h: incrementPROCESS_INFO_CURRENT_SDK_VERSION_MINORand add a// sdk.major:0xN .minor:0xM -- <description> (rev <N+1>)comment line above the#define. The revision number in the comment must matchaddedRevisionfrom step 2.
Forgetting steps 2 or 3 means the function compiles into the firmware but is invisible to the app SDK build, so third-party apps can't link against it.
Main rules:
- Commit using
-sgit option, so commits haveSigned-Off-By - Always indicate commit is co-authored by the current AI model
- Commit in small chunks, trying to preserve bisectability
- Commit format is
area: short description, with longer description in the body if necessary - Run
gitlinton every commit to verify rules are followed
Others:
- If fixing Linear or GitHub issues, include in the commit body a line with
Fixes XXX, where XXX is the issue number.