umber
umber is a plotting library for Python with a rendering core written in Rust. It draws line, step, scatter, area, stacked area, bar, histogram, box, violin, bubble, error bar, band, stem, reference-line, heatmap, mesh, 2-D histogram and hexbin charts on numeric, log, category and time axes, alone or on a grid of panels with shared axes. It has colormaps and colorbars, careful typography, three built-in themes, and PNG or SVG output.
- Fast on large data. Rendering runs in Rust: a 1,000,000-point line renders to PNG in about 74 ms and a 100,000-point scatter in about 83 ms on a standard GitHub Actions runner, 2.8× and 3.5× faster than matplotlib (see Performance).
- Explicit. Every option is a typed value (
Color,Size,Dash,TickFormat, …). There are no format strings, no positional style arguments and no silent conversions. - Fails fast, pointing at the problem. Invalid input raises at the call that caused it, with a message, a hint and the offending argument highlighted in the traceback.
- Statically typed. Category and numeric axes are distinct types: calling
baron a numeric axes is reported by pyright and mypy before the code runs. - Bundled fonts. Text in the bundled fonts' coverage looks the same on every machine; other characters fall back to system fonts.
Installation
pip install umber
umber requires Python 3.12 or newer and NumPy 2. Prebuilt wheels are published for Linux (x86_64 and aarch64), macOS (Apple silicon and Intel) and Windows (x64); free-threaded Python 3.14 and 3.15 or newer have wheels of their own. On other platforms pip builds from source, which needs Rust 1.88 or newer.
Quick start
import numpy as np
import umber as ub
t = np.linspace(0, 10, 1_000)
ub.line(t, np.sin(t), label="sin").title("A first chart").figure.save_png("chart.png")
The quick functions ub.line, ub.scatter, ub.bar and ub.hist create a figure with one axes and return the axes, so the rest of the chart is built by chaining.
Building a figure
import numpy as np
import umber as ub
rng = np.random.default_rng(7)
days = np.arange(60)
north = 20 + np.cumsum(rng.normal(0, 1, 60))
south = 18 + np.cumsum(rng.normal(0, 1, 60))
fig = ub.Figure(6, 4, theme=ub.Theme.GRAPHITE) # width and height in inches
ax = fig.add_axes()
ax.title("Daily temperature").subtitle("Two stations, last 60 days")
ax.xlabel("Day").ylabel("°C")
ax.line(days, north, label="North")
ax.line(days, south, label="South", dash=ub.Dash.DASHED)
fig.save_png("temperature.png", dpi=200)
fig.save_svg("temperature.svg")
This is the chart at the top of this page. Data can be a list, a tuple, a NumPy array, or a pandas or polars Series. Missing values (NaN, or nulls in nullable pandas and polars columns) leave a gap.
| Chart | Method |
|---|---|
| Line | ax.line(x, y) |
| Scatter | ax.scatter(x, y, marker=ub.Marker.TRIANGLE, size=ub.Size.times(1.5)) |
| Area | ax.area(x, y) |
| Bar, grouped, stacked | ax.bar(categories, heights), ax.grouped_bar(categories, series), ax.stacked_bar(categories, series) |
| Histogram | ax.hist(values, bins=30) |
| Step | ax.step(x, y, where=ub.Step.MID) |
| Stacked area | ax.stacked_area(x, [ub.Series("A", a), ub.Series("B", b)]) |
| Box, grouped | ax.box(categories, groups), ax.grouped_box(categories, [ub.Distribution("A", groups)]) |
| Violin, grouped | ax.violin(categories, groups), ax.grouped_violin(categories, distributions) |
| Bubbles | ax.bubbles(x, y, sizes, label="Cities") (adds a size legend) |
| Error bars | ax.y_error_bars(x, low, high), ax.x_error_bars(y, low, high) |
| Band | ax.band(x, low, high) |
| Stem | ax.stem(x, y) |
| Reference lines and spans | ax.hline(y), ax.vline(x), ax.hspan(low, high), ax.vspan(low, high) |
| Heatmap | ax.heatmap(x_categories, y_categories, values, annotate=True) |
| Mesh | ax.mesh(x_edges, y_edges, values) |
| 2-D histogram, hexbin | ax.hist2d(x, y, bins=40), ax.hexbin(x, y, gridsize=30) |
| Color-mapped points | ax.scatter(x, y, color=ub.ColorBy(values)) |
Bar, box and violin charts need a category axis. On a category x axis, fig.add_axes(x=ub.Scale.category()), they are vertical; on a category y axis, fig.add_axes(y=ub.Scale.category()), they are horizontal, and a scatter of values against categories is a dot plot. A heatmap needs category axes on both sides. Automatic category labels start at 0 and use the smallest step in 1, 2, 5, 10, 20, 50, ... that keeps neighbouring labels apart by the same minimum gap as numeric ticks; shared axes show the same labels. Category 0 is always labelled, so a first label wider than the available room still causes a tick-label error. Log axes use ub.Scale.log() and time axes ub.Scale.time(). Limits, ticks and tick label formats are set with xlim, ylim, xticks, xticks_labeled, ytick_format(ub.TickFormat.percent()) and their counterparts on the other axis.
Bars, histograms, areas and stems draw a baseline at zero (or at the lower edge when zero is out of range); other charts draw none. Override this for each axes with ax.baseline(shown=True) or ax.baseline(shown=False); ax.baseline(shown=ub.AUTO) restores the default.
Automatic limits contain whole bubble markers, outlines included; explicit limits clip them. Legend swatches show each mark's fill as drawn over the plot background.
Grids and shared axes
Figure(rows=2, cols=2) declares a grid. Its default width=ub.AUTO and height=ub.AUTO give each column 6 inches and each row 4 inches; an explicit size is for the whole figure. Add panels by their zero-based top-left cell:
import copy
import umber as ub
fig = ub.Figure(rows=2, cols=2, share_x=ub.Share.COL, legend=ub.Legend.MERGED)
fig.title("Station signals").subtitle("Shared time scales")
fig.add_axes(row=0, col=0).line([0, 1, 2], [1, 3, 2], label="North")
fig.add_axes(row=1, col=0).line([0, 1, 2], [2, 1, 3], label="South")
fig.add_axes(row=0, col=1, row_span=2).line([0, 1, 2], [1, 3, 2], label="North")
fig.save_png("subplots.png")
variant = copy.copy(fig)
variant.axes_at(row=0, col=1).title("Comparison") # the original is unchanged
Share.NONE, Share.ROW, Share.COL and Share.ALL choose which panels share a scale, limits, ticks and tick format. Legend.PER_PANEL keeps a separate legend for each panel instead of the default merged legend. Empty cells remain empty; overlapping panels are refused.
Use fig.axes_at(row=..., col=..., x=..., y=...) to retrieve axes, including those in a copy. The scale kinds and log bases must match creation; for category axes, pass x=ub.Scale.category() to get Axes[str, float]. A spanning panel is found only at its top-left cell. A row or column can be omitted only when that dimension has size 1. Figure.axes has been removed in favor of this typed method.
fig.cells() yields immutable Cell positions in row-major order, occupied or not; fig.cells(n) yields the first n. For example, for cell, values in zip(fig.cells(), datasets): cell.add_axes().line(x, values) adds one panel per dataset. AUTO is a typed sentinel, not None, and only parameters that declare it accept it.
Colors and colorbars
Heatmaps, meshes, 2-D histograms and hexbins color each cell by its value, and color=ub.ColorBy(values) does the same for the points of a scatter or bubble chart. The color-mapped marks of one axes share a single color scale, and a colorbar beside the plot explains it. From 10,000 cells, heatmaps, meshes and 2-D histograms draw their cells as one image with one pixel per cell instead of one shape per cell, which keeps large grids small and fast; render=ub.Render.VECTOR or render=ub.Render.RASTER chooses the form explicitly.
import numpy as np
import umber as ub
rng = np.random.default_rng(41)
x = rng.normal(size=20_000)
y = 0.6 * x + rng.normal(scale=0.7, size=x.size)
ax = ub.Figure(theme=ub.Theme.MIDNIGHT).add_axes()
ax.hexbin(x, y, gridsize=30, scale=ub.Scale.log()).colorbar("Count")
ax.figure.save_png("density.png")
cmap= chooses the colormap: each theme has its own sequential and diverging colormaps, and Cmap.VIRIDIS, Cmap.MAGMA, Cmap.CIVIDIS and Cmap.BLUE_RED are built in. Cmap.from_colors([...]) builds one from your colors, mixed in the perceptual Oklab space, and .reversed() turns one around. scale=ub.Scale.log() maps values on a log scale, and center=0 makes the mapping diverging and symmetric about that value. The color range runs from the smallest to the largest finite value; ax.clim(low, high) sets it, and values outside it take the end colors.
ax.colorbar(label, position=..., format=...) labels the colorbar, moves it below the plot with ColorbarPosition.BOTTOM or hides it with ColorbarPosition.NONE. On a grid, Figure(share_color=ub.Share.ROW) gives the panels of each row one color range and one colorbar at the right of the row; Share.COL puts one below each column, and Share.ALL one beside the whole grid. fig.colorbar(...) sets those shared colorbars.
Time axes
ub.Scale.time() makes a time axis. It takes datetime, date and numpy.datetime64 values, NumPy datetime64 arrays of any unit, and naive pandas and polars datetime columns:
import numpy as np
import umber as ub
hours = np.datetime64("2026-03-02T00", "h") + np.arange(7 * 24)
demand = 60 + 20 * np.sin((np.arange(7 * 24) - 6) / 24 * 2 * np.pi)
ax = ub.Figure(8, 4).add_axes(x=ub.Scale.time())
ax.band(hours, demand - 6, demand + 6, label="Range").line(hours, demand, label="Demand")
ax.vspan(np.datetime64("2026-03-05T01"), np.datetime64("2026-03-05T05"), label="Maintenance")
ax.figure.save_png("demand.png")
Ticks fall on calendar steps, such as months, days or hours, with concise labels; xtick_format(ub.TickFormat.iso()) writes them in ISO 8601 instead. Limits, ticks, reference lines and spans on a time axis take times. Times are kept to the microsecond, NaT leaves a gap, and a time zone is refused: convert to naive times first, for example with .tz_convert(None) in pandas. Bands and stacked areas take times on the x axis only.
Titles and legends
fig.title(text) and fig.subtitle(text) set text above the whole grid; ax.title(text) and ax.subtitle(text) belong to one panel. Each returns the same object for chaining, and an empty string removes the text. The figure title is 1.5 times the panel title size.
Theme.with_title_align(ub.Align.LEFT) sets title alignment; CENTER and RIGHT are also available. Subtitles follow their title. On a multi-panel figure, the merged legend stays below the figure title and subtitle and follows their alignment, without a separate position setting. To place legends by panel, use Legend.PER_PANEL.
import umber as ub
theme = ub.Theme.PIGMENT.with_title_align(ub.Align.CENTER).with_legend_position(
ub.LegendPosition.BOTTOM
)
fig = ub.Figure(theme=theme).title("Station signals")
ax = fig.add_axes().line([0, 1, 2], [1, 3, 2], label="North")
ax.legend(ub.LegendStyle.HEADER, position=ub.LegendPosition.RIGHT)
ax.legend(ub.LegendStyle.HEADER, position=ub.AUTO) # back to the theme's BOTTOM
For single-panel figures and Legend.PER_PANEL, LegendPosition.TOP_LEFT (default) and TOP_RIGHT place a row below the panel title; RIGHT places a column beside the plot; BOTTOM places a row below the x axis title; BEST places the legend inside the plot where it covers the least data. Panel legend positions do not follow title alignment. Omitting position, or passing ub.AUTO, clears a previous override and uses the theme's position; it does not mean BEST. LegendStyle.DIRECT accepts only the default position=ub.AUTO, since its labels sit at line ends. LegendStyle.NONE hides the legend.
Themes
Three themes are built in: Theme.PIGMENT (warm paper, serif titles), Theme.GRAPHITE (neutral, sans-serif) and Theme.MIDNIGHT (dark, monospaced figures). A theme is an immutable value; derive a variant with its with_* methods:
import umber as ub
theme = ub.Theme.MIDNIGHT.with_fill_style(ub.FillStyle.SOLID).with_legend_style(
ub.LegendStyle.HEADER
)
fig = ub.Figure(theme=theme)
Errors
An error is raised by the call that caused it: umber.DataError for invalid data, umber.StyleError for an invalid option value, umber.UsageError for a call that is not allowed in the current state, and TypeError for a value of the wrong type. The three umber errors derive from umber.UmberError. The traceback points at the argument:
Traceback (most recent call last):
File "example.py", line 7, in <module>
ax.line(t, y, label="signal")
~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
umber.DataError: Axes.line(): y[2] is inf; values must be finite.
ax.line(t, y, label="signal")
^
hint: use NaN to leave a gap in the line.
TypeError: Axes.line(): color is str; color must be of type Color.
ax.line([0, 1, 2], [1, 3, 2], color="red")
^^^^^^^^^^^
hint: use Color.hex("#3366B8"), Color.rgb() or a named color such as Color.BLUE.
In a terminal that supports it, the hint and the highlight are shown in color; set NO_COLOR to turn color off or FORCE_COLOR to force it. The same notes appear in Jupyter.
Static typing
The package ships type information (py.typed) and is checked with pyright and mypy in strict mode. Figure().add_axes() is Axes[float, float]; add_axes(x=Scale.category()) is Axes[str, float], add_axes(y=Scale.category()) is Axes[float, str], two category axes are Axes[str, str] and add_axes(x=Scale.time()) is Axes[Time, float]. Methods that only make sense on one kind of axis are typed accordingly:
import umber as ub
ax = ub.Figure().add_axes()
ax.bar(["a", "b"], [1, 2]) # pyright and mypy: bar() needs Axes[str, float]
Performance
End-to-end Python timings next to matplotlib 3.11.2 (Agg backend, default style), from the call that builds the figure to the encoded bytes. Figures are 6 × 4 in, PNG at 200 dpi, with the same input data for both. Each value is the median of 8 runs after a warm-up, with each library in its own process. Measured with umber 0.3.2 on GitHub Actions ubuntu-latest (AMD EPYC 9V74, 4 vCPUs, Python 3.12, NumPy 2.5) by the Python bench workflow (this run); the script is scripts/bench/python_vs_matplotlib.py. GitHub assigns different CPU models to the same runner label, so absolute times vary between runs; the speed-ups, measured side by side on one machine, are the figures to compare.
| Case | umber | matplotlib | Speed-up |
|---|---|---|---|
| 1,000,000-point line → PNG | 74 ms | 205 ms | 2.8× |
| 1,000,000-point line on a time axis → PNG | 91 ms | 220 ms | 2.4× |
| 1,000,000-point line → SVG | 24 ms | 65 ms | 2.7× |
| 100,000-point scatter → PNG | 83 ms | 291 ms | 3.5× |
| Histogram of 1,000,000 values → PNG | 32 ms | 64 ms | 2.0× |
| 2-D histogram of 1,000,000 points, 100 × 100 bins → PNG | 100 ms | 168 ms | 1.7× |
| Hexbin of 1,000,000 points, grid size 50 → PNG | 127 ms | 141 ms | 1.1× |
| Heatmap of 1,000 × 1,000 cells → PNG | 194 ms | 252 ms | 1.3× |
| Heatmap of 1,000 × 1,000 cells → SVG | 175 ms | 443 ms | 2.5× |
| 4 × 5 grid, one 10,000-point line per panel → PNG | 180 ms | 552 ms | 3.1× |
| 1,000-point line with a second series, title, labels and legend → PNG | 22 ms | 81 ms | 3.7× |
| 5-bar chart → PNG | 12 ms | 44 ms | 3.6× |
import in a fresh interpreter |
66 ms | 310 ms | 4.7× |
Pinned to one CPU, only the scatter plot is notably slower: 125 ms (2.3×). The 4 × 5 grid uses a 12 × 8 in figure. The script's docstring lists where the two libraries do different work, for example the hexbin grids, which are built differently.
Lines with sorted numeric or time x values are downsampled when they have more than four points per pixel column of the plot (counted at a nominal 300 dpi), keeping the first, last, minimum and maximum point in each column, which is visually lossless. Large scatter plots are composited on up to 8 threads; the output is the same for any number of threads.
Rust
The rendering core is published as the umber-core crate and can be used directly from Rust:
use umber_core::{AxisData, Figure, LineOptions, ScaleKind, Theme};
let mut figure = Figure::new(6.0, 4.0, Theme::pigment())?;
figure
.add_axes(ScaleKind::Linear, ScaleKind::Linear)?
.title("Signal")
.line(AxisData::Numbers(vec![0.0, 1.0, 2.0, 3.0]), &[1.0, 3.0, 2.0, 4.0], LineOptions::default())?;
std::fs::write("signal.png", figure.to_png(144)?)?;
Status
umber is at version 0.x. The API is not yet stable and may change or be removed without a deprecation period. More examples are in examples/.
License
Licensed under either of MIT or Apache-2.0, at your option (MIT OR Apache-2.0). Bundled fonts are under the SIL Open Font License 1.1; see crates/umber-core/fonts/LICENSES and crates/umber-core/fonts/MANIFEST.md. Wheels include statically linked Rust dependencies; their licenses are listed in THIRD-PARTY-LICENSES.txt.
Metadata
Release files for umber 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| umber-0.3.2.tar.gz | 1.5 MB | With provenance | Details |
Built distributions (wheels)
Total release size: 52.3 MB
Release files / umber-0.3.2.tar.gz
| Download URL | umber-0.3.2.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7d04fb2074acf7b9874d4b414248ba0e9cd74a5d50ea3d6ac0f9de9c7eaae155
|
|
BLAKE2b-256 checksum How to use checksums |
58841995d0249527d93ac0cc33cecb4e976d674b8d0cbfd2bd202c60a2250d33
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp315-abi3.abi3t-win_amd64.whl
| Download URL | umber-0.3.2-cp315-abi3.abi3t-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.15 Windows x86-64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
c8e2adbbf3fc6a1bb80e3cd5778c9d5bb5b3ef62d440856b55fafeeec6fc5f11
|
|
BLAKE2b-256 checksum How to use checksums |
63ae83a546220bdde2e7742d4a60ad1e787f90bc1b33e55745362d736d3b1d48
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | umber-0.3.2-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.15 Linux glibc 2.17+ x86-64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
d98d42bda3254a894117d7519cf35dc50143db387e930040bcc36539f6c4eccf
|
|
BLAKE2b-256 checksum How to use checksums |
d3e301d436c25ad56b1871b5054dd004fae4eda16add0892d15c6fee94aa85ac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | umber-0.3.2-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.15 Linux glibc 2.17+ ARM64 abi3 abi3t |
|
SHA-256 checksum How to use checksums |
bc4c36ca7777818b67f3f0d45c9f32de26e7e19105bda93bb648470f7c73f2d9
|
|
BLAKE2b-256 checksum How to use checksums |
0322781b2e5dc533b7ed83d0761dde7caa726cee232745a73f3cec3c85df5381
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp315-abi3.abi3t-macosx_11_0_arm64.whl
| Download URL | umber-0.3.2-cp315-abi3.abi3t-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.15 abi3 abi3t macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
35d889e4de172a0e7bdc26865f3dac1ca3c1ccb5ea7f3ebb5c988772492e77c6
|
|
BLAKE2b-256 checksum How to use checksums |
effdcc05c6ee34d8b2c2bcb245095e3c3fc4c676956d005c1bdd3b8681011f71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp315-abi3.abi3t-macosx_10_12_x86_64.whl
| Download URL | umber-0.3.2-cp315-abi3.abi3t-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.4 MB |
| Tags | CPython 3.15 abi3 abi3t macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
740cc6621e23513bbd202b3032fa9a07ab93ed3a577488fd119e39d085c09dfa
|
|
BLAKE2b-256 checksum How to use checksums |
15b6b4dc86ef6392bad2d5ea5138a1bad78deddfc72f94fe45d2fff1eea9f6ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp314-cp314t-win_amd64.whl
| Download URL | umber-0.3.2-cp314-cp314t-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Windows x86-64 |
|
SHA-256 checksum How to use checksums |
cc50cab7608943bd56701565a8d4e6b5ac0404356b2c04dd7a207da9389331d0
|
|
BLAKE2b-256 checksum How to use checksums |
5353f5d5ca0cedce13387ec583ca9aa748eb256c029cdf1bcc0875cf3bdb965a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | umber-0.3.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
9caf10462c1dd21aff65bc6ace10b0699274e77cb189824a72caa2dba31a480d
|
|
BLAKE2b-256 checksum How to use checksums |
0019beeacdebee6380b420dd661b3a904400f5379ce9c2400e205829b954110e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | umber-0.3.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
945e1667b616baf02032e6d0843065e19997d7d8111525002402ef38ceccf8ca
|
|
BLAKE2b-256 checksum How to use checksums |
c5200053a8a8987ea019bd55e87e1107f8b5aac5f2317d2227940ca3b50cadf3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl
| Download URL | umber-0.3.2-cp314-cp314t-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
daff04f079a6a75d58702067837ea6d558f4cb7b580797680f53f545db305a17
|
|
BLAKE2b-256 checksum How to use checksums |
51cf052b297c52ca702966408c0f312424bd738bed61cf5c874345e7632aaa68
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp314-cp314t-macosx_10_12_x86_64.whl
| Download URL | umber-0.3.2-cp314-cp314t-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.14 CPython 3.14 free-threading macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
543f484ea218b37322e7a9aec8bcaad705e4981e538c2f56fc646649e9c67118
|
|
BLAKE2b-256 checksum How to use checksums |
f349ff1420d5747e45318b56315ec582dd6049923c49813c6596833c9108cc10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp312-abi3-win_amd64.whl
| Download URL | umber-0.3.2-cp312-abi3-win_amd64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.12 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
f2315694c72f7387c68398cac4a78e26d313da9cdee88b96d31ab16eea1a20e9
|
|
BLAKE2b-256 checksum How to use checksums |
c4dbc38fed473f2e57f2ec872d01a8d2aae3651c8b4646252692c6b9842277ca
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | umber-0.3.2-cp312-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.6 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
358d0d3f8a2fd592ca517df51bc6628fb8c9b72884fe66e452fad7e295d9933a
|
|
BLAKE2b-256 checksum How to use checksums |
029865f8e0e5ab46df905bba2f2828602f324952d0d65896756288f856a93259
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | umber-0.3.2-cp312-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
d0200077375afca11f80360effb5d1cebecb94787db1bc702003bfcabc866277
|
|
BLAKE2b-256 checksum How to use checksums |
db891bf4e8a2a7b7237ae905156e1e09d42ba15b1689c9ab23054bc1df50e9e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp312-abi3-macosx_11_0_arm64.whl
| Download URL | umber-0.3.2-cp312-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.12 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
543c859f861b0b6e8fcb2bcbfad1e62daac90e20771d6499fc4725108d3de340
|
|
BLAKE2b-256 checksum How to use checksums |
cfe105fdc453c94c08a56d9c6e9ecff12bb2bad340601e96ec2229f532a7e4de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logRelease files / umber-0.3.2-cp312-abi3-macosx_10_12_x86_64.whl
| Download URL | umber-0.3.2-cp312-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.12 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ecf9d9ed7dc1ffb78080770625b0ee6195c6d8e849fbc525906fe14128d5d155
|
|
BLAKE2b-256 checksum How to use checksums |
1fed40c0f96ec5801b58789d633ef4fd89e3cd535cd21628fabddcd5857dba7b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logSecurity for umber 0.3.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 16 files in this release have been uploaded with provenance metadata.
Attestation for umber-0.3.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 18, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.