flamegraph-textual
June 5, 2026 ยท View on GitHub
flamegraph-textual is an interactive flamegraph component for
Textual.

It is the rendering library extracted from flameshow. Use it when you want to embed a terminal flamegraph inside your own Textual app instead of launching a standalone viewer.
Install
From PyPI:
pip install flamegraph-textual
From a local checkout:
git clone git@github.com:laixintao/flamegraph-textual.git
cd flamegraph-textual
pip install -e .
For development with Poetry:
git clone git@github.com:laixintao/flamegraph-textual.git
cd flamegraph-textual
poetry install
What It Does
- Renders flamegraphs as a Textual widget
- Parses profile input for you
- Supports keyboard and mouse navigation
- Supports multiple sample types when present in the profile
- Works with bundled demo data or your own files
Quick Start
FlameGraphView is the main entrypoint. Pass it raw profile data and a
filename. The library parses the content internally.
from pathlib import Path
from textual.app import App, ComposeResult
from flamegraph_textual import FlameGraphView
class Demo(App):
def compose(self) -> ComposeResult:
profile_bytes = Path("profile.out").read_bytes()
yield FlameGraphView(profile_bytes, filename="profile.out")
Demo().run()
For stackcollapse text input, passing str also works:
from pathlib import Path
from flamegraph_textual import FlameGraphView
profile_text = Path("stacks.txt").read_text(encoding="utf-8")
widget = FlameGraphView(profile_text, filename="stacks.txt")
# Optional: skip auto-detection when you already know the format
widget = FlameGraphView(
profile_text,
filename="stacks.txt",
profile_type="stackcollapse",
)
For Austin collapsed text, use the same parser explicitly:
from pathlib import Path
from flamegraph_textual import FlameGraphView
austin_text = Path("austin.txt").read_text(encoding="utf-8")
widget = FlameGraphView(
austin_text,
filename="austin.txt",
profile_type="austin",
)
Supported Input Formats
pprof: pprof protobuf profilesstackcollapse: generic collapsed-stack text in FlameGraph formataustin: Austin collapsed text; parsed with the same stackcollapse parser
Format Notes
pprofBinary protobuf profiles such as Gopprofoutput. Use this when your input is raw profile bytes.stackcollapsePlain text in collapsed-stack format, where each line looks likeframe_a;frame_b;frame_c 10.austinAustin's collapsed text output is stackcollapse-compatible, often with metadata comment lines such as# austin: ...,# interval: ..., and# mode: .... Those comment lines are ignored by the parser.
The parser selection is automatic through: parse
Try It Immediately
This repo includes sample profiles under:
Run the bundled examples with no setup:
python examples/pprof_binary.py
python examples/pprof_binary.py --sample goroutine
python examples/pprof_binary.py --sample heap
python examples/stackcollapse_text.py
python examples/stackcollapse_text.py --sample simple
python examples/stackcollapse_text.py --sample perf
You can still pass your own file path:
python examples/pprof_binary.py /path/to/profile.out
python examples/stackcollapse_text.py /path/to/stacks.txt
Main API
The public exports are defined in: init.py
Most users should start with:
- FlameGraphView for embedding a flamegraph widget in a Textual app
- parse if you want to parse profile bytes yourself
parse(...) and FlameGraphView(...) both support an optional
profile_type argument. Supported values are pprof, stackcollapse, and
austin. If omitted, the library auto-detects the parser as before.
Other public exports:
FlameGraphAppconvenience alias around the full demo-style appFlameGraphlower-level rendering widgetFlameGraphScrollscroll container used around the flamegraph widgetFrame,Profile,SampleTypedata model typesFrameMap,add_arraylower-level rendering helpers used by the widget
Controls
Inside the widget:
j/k/h/lor arrow keys move selectionEnterzooms inEsczooms outTabswitches sample typeiopens the detail screen when mounted inside a Textual app- Mouse hover updates frame details
- Mouse click zooms into a frame
Regenerate Protobuf Bindings
The canonical pprof schema lives in: profile.proto
The generated Python module lives in: profile_pb2.py
Regenerate it with:
poetry add --group dev grpcio-tools
poetry run python -m grpc_tools.protoc \
-I proto \
--python_out=flamegraph_textual/parsers \
proto/profile.proto
Development
Run tests with:
pytest -q
Changelog
Unreleased
- Added speedscope format parser (
SpeedscopeParser) supporting botheventedandsampledprofile types. - Added Google Trace Event format parser (
GoogleTraceParser). parse()andFlameGraphViewnow accept an optionalprofile_typekeyword argument ("pprof","stackcollapse","austin","speedscope","google_trace") to skip auto-detection.