Give your agent a browser.
A browser agent that picks from the controls a page actually has, cites the page for every claim, and keeps credentials, irreversible actions and spending under the control of code.
Why fastbrowse
- It picks, it does not invent. Each page is indexed into the controls it has, and Jev, a choice model, picks one. It cannot click something that is not on the page, and there are no selectors to maintain.
- Answers you can check. Every claim in a complete answer cites a verbatim quote from the page, with a link that scrolls to it. Pass a schema and get validated data back.
- Code holds the keys. Submit, pay, delete and send stop until you allow them. A secret is typed only on the origin it was declared for, and models only see its name. Step, time and dollar limits are enforced in code.
- Any browser. A Browser Use Cloud browser by default, local Chrome, or any Chromium browser or Electron app that is already running.
- One agent, every interface. A CLI, a Python library, Node and Go SDKs that need no Python, an MCP server, and a skill for coding agents.
Recorded on local Chrome against thepihut.com: 37 steps, about 4 minutes and $0.29 in model calls. Playback is sped up with pauses cut. The full-resolution recording is docs/assets/demo.mp4.
On 46 tasks run three times each against the hosted Browser Use agent, under the same limits on Browser Use Cloud browsers, fastbrowse passed 99.2% of runs to 96.3% and cost $0.0296 a run to $0.3180, 10.7x less. It was slower: 18.9s a task to 15.3s. These figures are the published campaign, release-0.7.1; see How it compares.
Try it
You need uv, which fetches Python 3.13 or newer itself, Chrome or Chromium, and an OpenRouter key:
export OPENROUTER_API_KEY=...
uvx fastbrowse "What is the title of the top story right now?" --start https://news.ycombinator.com/ --local
That one key serves both models: the LLM that plans, reads and writes, and Jev, the model that picks each action.
--local runs the Chrome on your machine; FASTBROWSE_CHROME names the binary if it is not found.
For regular use, add two keys and drop --local:
export TYPESAFE_API_KEY=... # Jev direct from Typesafe, the recommended route
export BROWSER_USE_API_KEY=... # a Browser Use Cloud browser
uvx fastbrowse "What is the title of the top story right now?" --start https://news.ycombinator.com/
With a Browser Use key the cloud browser is the default, because it passes bot checks a fresh local Chrome fails;
it also prints a URL to watch the run live. Without the key or --local, the command stops and asks for one.
AI_GATEWAY_API_KEY (Vercel AI Gateway) serves the LLM when OPENROUTER_API_KEY is unset. Jev can also run
through the gateway as a last resort, or another decision host with FASTBROWSE_DECISION_SOURCE.
Jev routing covers the order and other hosts.
Keys can live in a .env file in the working directory (.env.example lists every setting), but
values named by --secret must be in the process environment. uv tool install fastbrowse keeps the command on
your PATH, uv add fastbrowse adds it to a project, and npm install fastbrowse gives Node.js the same agent with
no Python.
To work on fastbrowse itself:
git clone https://github.com/agent-labs-dev/fastbrowse.git && cd fastbrowse
uv sync --all-extras # builds the Rust core, so it needs cargo (rustup installs the pinned toolchain)
cp .env.example .env # then fill in the keys, or pass --local
uv run fastbrowse "What is the title of the top story right now?" --start https://news.ycombinator.com/
Steps go to stderr; the status, cost, step count, why a run stopped short, and the answer go to stdout. --json
prints the full result: every step, the quotes behind the answer, and cost by component. The exit code is the
status, and only complete exits 0.
export SAUCE_PASSWORD=secret_sauce
uvx fastbrowse "Log in as standard_user with the saved password and add the backpack to the cart." \
--start https://www.saucedemo.com/ --secret password=SAUCE_PASSWORD --authorize --local
The command-line reference has every flag, signed-in profiles and Bitwarden logins, driving open windows and Electron apps, model and provider settings, and every status with its exit code.
How it compares
| Browser Use agent (hosted) | Browser Use Ultrafast (jev-ultrafast) |
fastbrowse | |
|---|---|---|---|
| Choosing an action | hosted model and tools | Jev picks from indexed controls | Jev picks from indexed controls |
| Returns | an answer | DONE or BLOCKED |
an answer with quotes, or why it stopped |
| Cited answers | not graded for citations here | no cited-answer result API | answers backed by captured quotes |
| Signing in | yes | password fields excluded | --secret or a Bitwarden vault item; models see names only |
| Irreversible actions | explicit task instructions in our fixture tests | no authorization parameter in Agent | classifier plus a code-enforced authorization gate |
| Browser | cloud | Chrome through Browser Harness; cloud in these evals | cloud by default, or local Chrome with --local |
The Ultrafast column describes commit 1231850a, the version the eval runner pins.
Benchmarking makes three comparisons:
- C1, agent against agent: fastbrowse against the hosted Browser Use agent, the figures above, on Browser Use cloud browsers under identical limits with the hosted agent at its defaults. On its own 53-task catalog, fastbrowse passed 99.3% at 17.0s and $0.0268 a run.
- C2, browser against browser: the same fastbrowse build on its own browser pool and on a Browser Use Cloud browser. In an earlier record (release-0.5.25), not on the published page, the pool passed fewer tasks.
- C3, fastbrowse on its pool against
jev-ultrafast, over 6 tasks: not yet measured.
The benchmark page publishes campaign release-0.7.1 (agent commit 7b8b0e8f,
data sha256 7d6ac26f23fa6d354128fa7e4bcc8190125c441f4f136dc39d0e3c35cec5d4e2).
Benchmark results gives the sources, cost basis and limitations, and
eval results and workflow covers the diagnostic suites.
How it works
The LLM plans, reads and writes. Jev picks each action. Code owns the gates: irreversible actions stop without
--authorize, secrets reach models by name only, and supported cookie banners are refused through autoconsent.
More in docs/design.md.
The core is Rust, in crates/, and every interface hands its work to it; the wheel carries it as
fastbrowse._native (ADR 0004). Against the Python core it replaced, it
reached the same result on all 36 fixture tasks with 18x less agent CPU, 54x faster startup and 5.4x less peak
memory (measurements).
Embed it
uv add fastbrowse first, then:
import asyncio
from pydantic import BaseModel
from fastbrowse import run_task
from fastbrowse.models import Limits
class Release(BaseModel):
package: str
version: str
async def main() -> None:
result = await run_task(
"Find the httpx package and report its name and latest released version.",
start="https://pypi.org/",
output_schema=Release,
limits=Limits(max_dollars=0.10),
)
print(result.status, result.data, f"${result.cost.known_dollars:.4f}")
for evidence in result.evidence:
print(f' "{evidence.quote}" from {evidence.url}')
asyncio.run(main())
Choosing the browser. With no browser argument, run_task runs local Chrome. browser_api_key= starts a
cloud browser, and cloud_extensions=[...] loads up to three of your account's Browser Use Cloud extensions into
it. cdp_url= or cdp_port= drives a browser already running: the run opens and closes its own tab and leaves
the rest, though cookies the task sets can persist. attach=True, target_match= and foreground=True work as
the matching flags do. Passing a cloud key and a CDP address together is an error.
Your own script on the page. connect_cdp() hands you the attached page without the agent, and
resolve_cdp_port(port) returns the ws:// URL behind a DevTools port:
from fastbrowse import connect_cdp
async def main() -> None:
async with connect_cdp(9222, target_match="my-project") as page:
print(await page.observe())
Access controls that only the Python API offers:
allowed_origins=["https://app.example.com"]limits the documents a run may read and control to those exact origins. Navigations, redirects, frames and popups elsewhere are refused before they are sent, so a sign-in that redirects through another origin needs it listed too. It scopes documents, not the network, and a scoped run sends no live frames or screenshots and cannot record.check_access=is an async callback awaited before the browser starts and before every read, navigation and action. If it raises, the run ends with statuserror(connect_cdpraisesBrowserError), naming only the exception's type.
Citations. result.citations holds a Citation per numbered link in result.answer: id, text,
requirement_id, url, quote and deep_link. Counts, totals and superlatives cite every record they were
derived from. A deep_link is a text fragment URL that
scrolls to the quote; it may not resolve on a page that changes or needs a session.
Watching a run.
on_event=gets aBrowserEventwith a cloud browser's live-view URL, then aStepEventper step, carrying the facts that step added.Config(step_frames=True)adds a PNG of each step's page.Config(step_choices=True)addschoicesto each step Jev decided: the controls it was offered, each with itsid,role, maskedlabelandcontext(the card or row that tells twins apart) andoperations, and the one it picked markedchosen(a drag marks its destination too). It shows whether the element a run should have used was there to pick. Off, a step has nochoiceskey.on_frame=gets JPEG frames of the active tab as they render. The handler runs on your event loop, so it must honour cancellation: one that swallowsCancelledErrorkeepsasyncio.runwaiting at shutdown.with traced() as events:collects the run's trace in-process, as--tracewrites it.
No frame or screenshot is sent while a resolved secret may show on the page.
run_task(jev=...) and run_task(llm=...) take your own decision model or LLM client; see
Jev routing and fastbrowse.llm.
Choosing the model backend without the environment. New in 0.9.1.
run_task(settings={...}) takes the same names as the
environment variables (OPENROUTER_API_KEY, AI_GATEWAY_API_KEY, TYPESAFE_API_KEY, FASTBROWSE_DECISION_SOURCE,
FASTBROWSE_LLM_PROVIDER, FASTBROWSE_LLM_MODEL and the rest) and reads them instead of the environment and
.env, so a service that keeps its credentials elsewhere hands the run exactly the keys it means to:
result = await run_task("Find the latest httpx release", settings={"OPENROUTER_API_KEY": my_key})
The same rules outside a run. New in 0.9.1. fastbrowse.origins (origin_of, parse_origin) parses allowed_origins as the
run does; fastbrowse.safety (secret_allowed, origin_of, ScopedSecrets) answers where a secret may be typed,
*. patterns included; fastbrowse.totp.one_time_code(key) makes the codes an authenticator key gives. Each wraps
the core's own rule, so the answer before a run is the one the run gives.
Use it from JavaScript
npm install fastbrowse gives a Node.js 20+ program the same agent with no Python on the machine. The SDK has no
dependencies; npm also installs a native binary for your platform (@fastbrowse/darwin-arm64, darwin-x64,
linux-arm64, linux-x64 or win32-x64). No install script runs and nothing downloads on first use. It reads
the same keys from your environment, and finds local Chrome, starts a cloud browser or drives one already running,
as the CLI does.
npm install fastbrowse zod
export TYPESAFE_API_KEY=...
export OPENROUTER_API_KEY=...
import { Fastbrowse } from 'fastbrowse';
import { z } from 'zod';
const Release = z.object({ package: z.string(), version: z.string() });
const fb = await Fastbrowse.start({ local: true });
try {
const result = await fb.run('Find the httpx package and report its name and latest released version.', {
start: 'https://pypi.org/',
output: Release,
limits: { maxDollars: 0.1 },
onEvent: event => {
if (event.type === 'step') console.error(event.step.operation, event.step.target);
},
signal: AbortSignal.timeout(120_000),
});
console.log(result.status, result.answer);
if (result.status === 'complete') console.log(result.output.package, result.output.version);
for (const evidence of result.evidence) console.log(` "${evidence.quote}" from ${evidence.url}`);
} finally {
await fb.close();
}
- One instance runs one task at a time; start more instances to run side by side. The process exits with yours.
runresolves with the result whatever the status. It rejects when no run finished (RpcErrorfor a refused request,AbortErrorwhensignalstopped it,ProcessExitedErrorwhen the process is gone), and withOutputValidationErrorwhen the data fails your schema.- The result is Python's
RunResult, with Python field names.outputisdatavalidated by your Zod (4.2+), ArkType or Valibot schema, or a plain JSON Schema; data the schema refuses rejects withOutputValidationError. A run fills a flat object of required string, number, integer and boolean fields.
Secrets and the final check stay in your code:
await fb.run('Log in as standard_user with the saved password and add the backpack to the cart.', {
start: 'https://www.saucedemo.com/',
authorization: { irreversibleActions: true },
secrets: {
refs: [{ name: 'password', origins: ['https://www.saucedemo.com'] }],
resolve: name => vault.get(name),
},
until: url => url.endsWith('/cart.html'),
});
resolve is called each time a value is typed, only on an origin its ref covers. until gets the final address,
and anything but true keeps the run from complete. The other options are run_task's in camelCase; the
SDK README lists them with the error model.
There is no binary for musl systems such as Alpine; point binaryPath or FASTBROWSE_BINARY at your own. The
macOS binaries are ad-hoc signed, not notarized, and the Windows binary is unsigned. Bun and Deno are untested.
Use it from Go
The Go module starts the fastbrowse binary and runs tasks over the same protocol the JavaScript SDK uses:
go get github.com/agent-labs-dev/fastbrowse/go
client, err := fastbrowse.Start(ctx, fastbrowse.Options{})
if err != nil {
return err
}
defer client.Close(context.Background())
result, err := client.Run(ctx, "What is the top story's title?", fastbrowse.RunOptions{
Start: "https://news.ycombinator.com/",
})
The first Start downloads the release's binary for the platform into the user cache directory, checked against
the SHA-256 the module pins; Options.BinaryPath or FASTBROWSE_BINARY names another. Cancelling ctx stops a run
once its browser has closed. RunOptions takes the same options as the SDK: OutputSchema, Secrets, Until,
OnEvent and OnFrame. One client runs one task at a time.
Rust, Java and .NET
Clients for Rust (crates/fastbrowse), Java and Kotlin (java) and .NET
(dotnet) are in this repository and run tasks the way the JavaScript and Go SDKs do. None is on
crates.io, Maven Central or NuGet yet, so cargo add fastbrowse, the Maven coordinates and
dotnet add package Fastbrowse do not resolve today.
Use fastbrowse with your agent
Install the fastbrowse skill to delegate website tasks from any agent that supports Agent Skills, such as Codex or Claude Code. It uses the MCP server when connected, or the CLI, and keeps the task's citations, status, authorization and budget. Nebula also runs fastbrowse in its agent harness, with Bitwarden or 1Password logins scoped to authorized websites.
Use it from an MCP client
fastbrowse-mcp serves one browse tool over MCP to Claude Code, Claude
Desktop, Cursor or any MCP client. It returns the answer with numbered citation links, typed fields if asked
for, the quotes behind them, the status and what to do next, and reports progress every step.
claude mcp add fastbrowse -e TYPESAFE_API_KEY=... -e OPENROUTER_API_KEY=... -e BROWSER_USE_API_KEY=... \
-- uvx --from fastbrowse fastbrowse-mcp --max-dollars 0.25
For a client configured by JSON, such as Claude Desktop:
{
"mcpServers": {
"fastbrowse": {
"command": "uvx",
"args": ["--from", "fastbrowse", "fastbrowse-mcp"],
"env": { "TYPESAFE_API_KEY": "...", "OPENROUTER_API_KEY": "...", "BROWSER_USE_API_KEY": "..." }
}
}
}
The server's flags set what a calling model may do; a call can ask for less, never more.
| Flag | Effect |
|---|---|
--local, --headed, --profile DIR, --foreground, --downloads DIR, --cursor |
as for the CLI, fixed for every call |
--cloud-profile ID |
every call runs as that cloud profile |
--allow-authorize |
let a call pass authorize; without it irreversible actions always stop at needs_confirmation |
--secret NAME=ENV_VAR@ORIGIN |
typed when a call's start page is on ORIGIN; the model sees NAME only |
--bitwarden ITEM |
a vault login a call may name in bitwarden |
--max-steps N, --max-dollars N, --max-seconds N |
ceilings per call; unlimited by default |
--max-concurrent N |
runs at once, default 1; more calls wait |
--transport http, --host, --port |
streamable HTTP at /mcp instead of stdio |
Over HTTP, set FASTBROWSE_MCP_TOKEN and every request but /healthz needs Authorization: Bearer <token>; the
server refuses to bind beyond loopback without one. A run takes seconds to minutes, so raise the client's tool
timeout if it has one (MCP_TOOL_TIMEOUT in Claude Code).
Safety model
- Irreversible actions. Jev judges each click, Enter press and dialog acceptance. Without authorization, a
confident irreversible action stops at
needs_confirmation, and an uncertain one goes to recovery. This is a classifier, not a guarantee: a page can word a harmful control to look harmless. - Secrets. Models see names only. A value is resolved at the moment it is typed, only on its declared origin, and redacted from everything the run returns. A password field is typed only from a stored secret.
- Page content is data. Reader and verifier prompts say so, and completion is judged against quotes and page state, not the model's say-so.
Evals and development
Eval commands cover running suites, publishing results and regenerating evidence; the compact results feed is generated from published rows. See CONTRIBUTING.md for setup and checks, docs/design.md for the browser layer, and docs/jev.md for the Jev assumptions checked against Typesafe's documentation.
Changelog
CHANGELOG.md records each release, and every GitHub release publishes its entry.
Credits
Thanks to Dhaiwat10, jmclark-lab and imranye for code, to Adam13y for the known-answer safety scenarios, and to everyone who reported a bug or asked for a feature, here or on Product Hunt. CREDITS.md has the full list.
License
MIT, copyright Agent Labs. Adapted third-party code is credited in NOTICE.
Metadata
Release files for fastbrowse 0.9.1
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 | Actions |
|---|---|---|---|---|
| fastbrowse-0.9.1.tar.gz | 3.3 MB | With provenance | Details for fastbrowse-0.9.1.tar.gz |
Built distributions (wheels)
| File | Actions Reset | |||
|---|---|---|---|---|
| fastbrowse-0.9.1-cp313-abi3-win_amd64.whl | CPython 3.13 | abi3 | Windows x86-64 | Details for fastbrowse-0.9.1-cp313-abi3-win_amd64.whl |
| fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_x86_64.whl | CPython 3.13 | abi3 | Linux glibc 2.34+ x86-64 | Details for fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_x86_64.whl |
| fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_aarch64.whl | CPython 3.13 | abi3 | Linux glibc 2.34+ ARM64 | Details for fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_aarch64.whl |
| fastbrowse-0.9.1-cp313-abi3-macosx_11_0_arm64.whl | CPython 3.13 | abi3 | macOS 11.0+ ARM64 | Details for fastbrowse-0.9.1-cp313-abi3-macosx_11_0_arm64.whl |
| fastbrowse-0.9.1-cp313-abi3-macosx_10_12_x86_64.whl | CPython 3.13 | abi3 | macOS 10.12+ x86-64 | Details for fastbrowse-0.9.1-cp313-abi3-macosx_10_12_x86_64.whl |
Total release size: 41.3 MB
Release files / fastbrowse-0.9.1.tar.gz
| Download URL | fastbrowse-0.9.1.tar.gz |
|---|---|
| Size | 3.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a41a95172413c7aa121b5e8c6affd656b7ffe1a94dd39e103cfc380bdcba263f
|
|
BLAKE2b-256 checksum How to use checksums |
64877863917491655faedca5eb57bbdf8bdc4ee6a945997a7a0d881943ee687f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logRelease files / fastbrowse-0.9.1-cp313-abi3-win_amd64.whl
| Download URL | fastbrowse-0.9.1-cp313-abi3-win_amd64.whl |
|---|---|
| Size | 7.5 MB |
| Tags | CPython 3.13 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
c12e18f5d435e2e704052627d5f20d8e4947780e06767aa49b74223a1837a1c1
|
|
BLAKE2b-256 checksum How to use checksums |
92ccce222f80afab9c290c4ad2963f48e88f3896ebe045bd8bbf2d7df12b2232
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logRelease files / fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_x86_64.whl
| Download URL | fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_x86_64.whl |
|---|---|
| Size | 8.4 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
b9125eb0ba3cbc04d0d1bd0bc62b5ed48918c06513041e574722484f69ab0eeb
|
|
BLAKE2b-256 checksum How to use checksums |
fe9609274b49a1163dfaf0f67d84dbee7587a448c0b5390950d92d2f458d3a80
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logRelease files / fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_aarch64.whl
| Download URL | fastbrowse-0.9.1-cp313-abi3-manylinux_2_34_aarch64.whl |
|---|---|
| Size | 8.0 MB |
| Tags | CPython 3.13 Linux glibc 2.34+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
41a0d1ea505e762023747d7d27050a9885f67f9736e23065fb6ffea65539032e
|
|
BLAKE2b-256 checksum How to use checksums |
2b0c87f6399f07f3321911aa4c8743579df4a1fd107f89c82c3dd57f22432c54
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logRelease files / fastbrowse-0.9.1-cp313-abi3-macosx_11_0_arm64.whl
| Download URL | fastbrowse-0.9.1-cp313-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 6.9 MB |
| Tags | CPython 3.13 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
6e164ba90a9357df006ece072cf2acab2497b2f7ae8ae62f0288fad953e98449
|
|
BLAKE2b-256 checksum How to use checksums |
4f9aaeb949904213d3ed3e83603e23e43151824fbaf2e8a79a3ccdf3fda42571
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logRelease files / fastbrowse-0.9.1-cp313-abi3-macosx_10_12_x86_64.whl
| Download URL | fastbrowse-0.9.1-cp313-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 7.3 MB |
| Tags | CPython 3.13 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
2443151f5f2d3ef94051ddbccba2efabfa139666a70e34a3133d408b943c30ff
|
|
BLAKE2b-256 checksum How to use checksums |
631af7ac10fa535db541b5562a485b1b815bc925f1aa0409ccf5b5d703a8f695
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 30, 2026.
Transparency logSecurity for fastbrowse 0.9.1
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 6 files in this release have been uploaded with provenance metadata.
Attestation for fastbrowse-0.9.1.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 30, 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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.