Back to directory
membrowse avatar
membrowse / membrowse-action

membrowse-action

Track and analyze binary size and memory footprint in embedded firmware

33

Stars

1

Forks

1

Watchers

GPL-3.0

License

MemBrowse logo

MemBrowse

PyPI version Python Versions License: GPL v3 Downloads GitHub Marketplace — verified creator GitHub stars

Catch memory regressions before they ship. MemBrowse tracks the flash and RAM footprint of your firmware on every commit, comments the memory diff on every pull request, and fails the build when you blow your budget.

It extracts detailed memory information from ELF files and linker scripts — down to symbol-level analysis with source file mapping across multiple architectures. Use the CLI standalone for instant local analysis, or connect it to MemBrowse for historical tracking, PR diffs, and CI gating.

Get your free API key: Sign up to unlock PR comments, historical tracking, and budget alerts. No account needed to use the CLI locally.

📖 Full documentation: docs.membrowse.com

MemBrowse dashboard: targets overview, memory timeline, commit-to-commit diff, and CI budget gating

Firmware teams tracking memory with MemBrowse

Flipper Devices
Flipper Devices
wolfSSL
wolfSSL
Apache NuttX
Apache NuttX
RT-Thread
RT-Thread
TinyUSB
TinyUSB
SuperTinyKernel
SuperTinyKernel
CMRX
CMRX

…and more.

Features

  • Architecture Agnostic: Works with any toolchain that produces ELFs with DWARF debug info (ARM, Xtensa, RISC-V, and more)
  • Source File Mapping: Symbols are mapped back to their definition source files
  • Memory Region Extraction: Reads memory layout from GNU LD scripts, IAR ICF files, and SEGGER Embedded Studio .emProject files
  • Cloud Integration: Upload reports to MemBrowse for historical tracking, PR diffs, monitoring, and CI gating

Quick Start

Analyze your firmware locally (no account required)

pip install membrowse

membrowse report build/firmware.elf "src/linker.ld"

Example output:

ELF Metadata: build/firmware.elf  |  Arch: ARM  |  Machine: EM_ARM  |  Toolchain: gcc-10.3.1  |  Entry: 0x0802015d  |  Type: ET_EXEC
==========================================================================================================================================================

Region               Address Range                                Size                Used                Free  Utilization
--------------------------------------------------------------------------------------------------------------------------------------------
FLASH                0x08000000-0x08100000             1,048,576 bytes       365,192 bytes       683,384 bytes  [██████░░░░░░░░░░░░░░] 34.8%
  └─ FLASH_START     0x08000000-0x08004000                16,384 bytes        14,708 bytes         1,676 bytes  [█████████████████░░░] 89.8%
     • .isr_vector              392 bytes
     • .isr_extratext        14,316 bytes
  └─ FLASH_TEXT      0x08020000-0x08100000               917,504 bytes       350,484 bytes       567,020 bytes  [███████░░░░░░░░░░░░░] 38.2%
     • .text                350,476 bytes
RAM                  0x20000000-0x20020000               131,072 bytes        26,960 bytes       104,112 bytes  [████░░░░░░░░░░░░░░░░] 20.6%
  • .bss                     8,476 bytes
  • .heap                   16,384 bytes
  • .stack                   2,048 bytes

Top 20 Largest Symbols
======================

Name                                     Address                    Size  Type       Section              Source
--------------------------------------------------------------------------------------------------------------------------------------------
usb_device                               0x20000a30          5,444 bytes  OBJECT     .bss                 usb.c
mp_qstr_const_pool                       0x08062b70          4,692 bytes  OBJECT     .text                qstr.c
mp_execute_bytecode                      0x080392f9          4,208 bytes  FUNC       .text                vm.c
...

See the CLI reference for JSON output, symbol filtering, uploading, and historical onboarding.

Track memory in CI (GitHub Actions)

Add a workflow that analyzes each push/PR and comments the diff on pull requests:

name: Memory Analysis
on: [push, pull_request]

jobs:
  analyze:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Build firmware
        run: make all # your build commands

      - name: Analyze memory
        uses: membrowse/membrowse-action@v1
        with:
          elf: build/firmware.elf
          ld: "src/linker.ld"
          target_name: stm32f4
          api_key: ${{ secrets.MEMBROWSE_API_KEY }}

      - name: Post PR comment
        if: github.event_name == 'pull_request'
        uses: membrowse/membrowse-action/comment-action@v1
        with:
          api_key: ${{ secrets.MEMBROWSE_API_KEY }}
          commit: ${{ github.event.pull_request.head.sha }}

Add your MemBrowse API key as a repository secret named MEMBROWSE_API_KEY (get one free). The action is published on the GitHub Marketplace by a verified creator.

For historical onboarding, custom comment templates, overflow tracking (limits), and all action inputs, see docs.membrowse.com.

Set it up with Claude Code

If you use Claude Code, install the MemBrowse plugin and let it wire everything up for you:

/plugin marketplace add membrowse/membrowse-action
/plugin install membrowse@membrowse-marketplace
/membrowse-integrate

This analyzes your build, verifies linker scripts, creates the config, and sets up the GitHub Actions workflows.

Platform Support

MemBrowse works with any toolchain that produces ELF files. Supported memory layout sources:

  • GNU LD linker scripts (*.ld, *.cmd), including INCLUDEd sub-scripts
  • IAR EWARM ICF files (*.icf)
  • SEGGER Embedded Studio project files (*.emProject)

Format detection is content-based, so the file extension doesn't have to match.

Not getting optimal results? Contact us at [email protected] — we're actively improving MemBrowse.

Documentation & Support

License

See LICENSE file for details.

Releases

Jun 25, 2026

Download .zip

What's Changed

Bug fix: multiple commits pull requests on pushing to master

Jun 22, 2026

Download .zip

What's Changed

Fix skill installation instructions in README support tokenless uploads from base oss github repo

Jun 15, 2026

Download .zip

What's Changed

add support for keil linker file fix skill - membrowse-comment should not be triggered if membrowse-report is skipped by fix skill - history depth to 2 in memory reports Fix arithmetic...

May 26, 2026

Download .zip

What's Changed

support SEGGER emproject config file parsing feature: skip section update python action version fix: comment action fix: Render default Code/Data regions with no known limit as "unknow...

Apr 30, 2026

Download .zip

What's Changed

support newer iar map format fix gcc map parser