mrkeyoor.com_
Tue 01 Sept 17:41 UTC
Dev Toolsevaluationupdated 28 Aug 2026

bore review

Bore is a small Rust command-line tool that exposes a local TCP port through a remote server. It solves the basic NAT and firewall problem for developers who need someone else to reach a service running on their laptop or private network.

+21 / 3dstars / 7d
Verdict

Our Bore run installed 95 packages and passed all 24 tests, making it an easy choice for a temporary TCP tunnel that you are willing to supervise. Use it for short-lived developer access or behind your own server controls. Do not treat the shared secret as traffic encryption, and do not make the public bore.pub instance a production dependency.

We ran it

Lab card: what happened when we ran bore
Install✓ · 20s95 packages
Build✓ · 34s
Tests✓ · 21s24 passed · 0 failed of 24 (cargo test)
Repo24 files~822 lines of source · 0.1 MB · 4 CI workflows · Dockerfile · tests dir

Answers from our run

Does bore build from source?

Dependencies installed in 20 seconds (95 packages), and the build succeeded in 34 seconds. We cloned commit 00a735a into a clean Debian container with 3 CPUs and no project-specific setup.

Do bore's tests pass?

Yes: 24 of 24 passed when we ran the project's own test command (cargo test). Some failures need services or credentials a bare container does not have.

Who should not use bore?

Anyone who assumes tunnel traffic is encrypted: the README says the secret protects the handshake, while later traffic is unencrypted by default.

What are the alternatives to bore?

rathole, frp, localtunnel. Our Bore run installed 95 packages and passed all 24 tests, making it an easy choice for a temporary TCP tunnel that you are willing to supervise.

Setup5/520-second install, one binary, all 24 tests passed
Docs4/5Commands, protocol, and encryption limit are plainly documented
Community4/511,456 stars with issue and PR activity in July 2026
Maturity4/5Small stable scope, with connection recovery gaps still open

Discussed on

  1. hnBore: A simple CLI tool for making tunnels to localhost272 points

Who it’s for

Developers sharing a temporary web server, API, SSH port, or other TCP service.
Self-hosters who want one binary on the client and one on a public server.
Teams that prefer a narrow TCP tunnel over a hosted dashboard and account system.
Rust users who want a readable protocol implementation with a passing local test suite.

Who it’s NOT for

Anyone who assumes tunnel traffic is encrypted: the README says the secret protects the handshake, while later traffic is unencrypted by default.
Services that need HTTP routing, TLS termination, access policies, inspection, or browser-friendly subdomains: Bore forwards TCP ports and leaves those layers to you.
UDP applications: issue 139 confirms UDP is outside the project's scope.
Operators who need the client to exit or reconnect automatically after a broken connection: issues 190 and 147 describe processes staying alive or failing to resume, while proposed fixes remain unmerged.
Teams depending on bore.pub for production availability: issue 150 records an abuse-related domain suspension and says continued public service could not be guaranteed.

Setup reality

Our sandbox installed 95 packages in 20 seconds, built Bore in 34 seconds, and completed all 24 tests in 21 seconds. The 0.1 MB checkout contained 24 files and about 822 lines of source at commit 00a735a.

The basic public route needs no account: point bore local at bore.pub. Self-hosting needs a reachable server, TCP control port 7835, an allowed range of tunnel ports, and an optional shared secret on both ends.

Prebuilt binaries cover macOS, Windows, and Linux; the published container targets AMD64. Traffic is not encrypted after authentication, UDP is unsupported, and open connection-loss reports make service supervision worth testing before unattended use.

Bore exposes one TCP port with one client command

Bore forwards a local TCP listener through a server that can accept connections from the internet. The common path is bore local 8000 --to bore.pub, which assigns a remote port and sends its traffic to localhost. That covers previewing an API, reaching SSH, testing a webhook receiver, or sharing any service that speaks TCP. There is no account dashboard, project object, or HTTP-specific routing layer to learn.

The narrow scope is the appeal. The checkout at commit 00a735a was 0.1 MB, with 24 files and about 822 lines of source by our count. A control connection on port 7835 asks the server for a tunnel port. Each incoming connection then gets a UUID, and the client opens a matching stream back to the server. Unaccepted connections are discarded after 10 seconds, which keeps abandoned handshakes from collecting forever.

Self-hosting needs one reachable server and a port range

A self-hosted Bore server starts with bore server and listens on all interfaces by default. Operators can set minimum and maximum public ports, separate the control binding from the tunnel binding, and add a shared secret. The client can request a particular remote port, although the request fails when that port is unavailable. This is enough for a personal VPS or a controlled development network.

Versioned binaries are published for macOS, Windows, and Linux, and Homebrew carries bore-cli. Cargo users can compile it themselves. The Docker image contains a statically linked binary in a minimal scratch image, but the README identifies AMD64 as its published architecture. A server also needs firewall rules for control port 7835 and the chosen tunnel range. Opening only 1 tunnel port does not remove the separate control connection.

What happened when we ran it

Our sandbox installed 95 Rust packages in 20 seconds. The build completed in 34 seconds, and cargo test finished in 21 seconds with 24 passed and 0 failed. Bore therefore cleared every available test in the supplied fresh Debian environment at commit 00a735a. The repository also had 4 CI workflow files, a Dockerfile, and a tests directory.

Those figures measure installation, compilation, and the project's test suite. They do not measure tunnel throughput, latency, public-server uptime, or behavior across a real network interruption. We did not invent those results from the README, and we are not turning a 21-second test run into a performance claim. Anyone choosing Bore for an always-on link should add a disconnect test on the exact operating system and supervisor that will run it.

The shared secret does not encrypt tunnel traffic

Bore can require a secret on a private server. Each TCP connection proves possession by answering a random HMAC challenge, which stops an unauthenticated client from opening tunnels through that server. The README then states the important limit: the secret covers the initial handshake, and later traffic is not encrypted by default. Plain HTTP, database protocols, and other cleartext payloads remain cleartext across the tunnel.

For sensitive data, put encryption inside the forwarded protocol or add a transport layer designed for it. SSH and HTTPS already carry their own protection when configured correctly. A raw admin panel on HTTP does not become safe because Bore used a secret before forwarding it. This distinction is the main reason Bore belongs in a developer toolbox more readily than at the edge of a production network.

Connection recovery still needs operator attention

Open issue 190, created in March 2026, asks for an option that exits when the remote connection breaks. Its report says the Bore process can remain alive after a network change, so systemd sees nothing to restart. Issue 147 describes a related Windows case where connectivity returned after more than 10 minutes but the client did not resume, and manual restart attempts sometimes met a port-in-use error.

There are proposed changes. Pull request 188 adds reconnection with backoff, while pull request 191 adds systemd socket activation. Neither belongs to the reviewed commit simply because a proposal exists. If a persistent tunnel must recover unattended, test process exit, port release, server restart, and network loss. A passing set of 24 repository tests is good evidence for the checked behavior, but it does not close those field reports.

The public server is convenient and carries an abuse risk

The README still uses bore.pub for the shortest demonstration, so a first trial needs no server account or cloud setup. Issue 150 records that the domain was suspended after phishing reports in December 2024. The maintainer wrote that users might need to self-host because continued support for the public instance could not be guaranteed. The issue was updated in February 2026, which makes it relevant to current deployment decisions.

GitHub showed 11,456 stars, 14 combined issues and pull requests, and a last push on February 4, 2026. The newest release, v0.6.0 from June 2025, fixed handling of half-closed TCP streams. Open issue and pull request activity continued through July 2026, so the release date alone does not suggest abandonment. Bore remains a sharp small tool. Its best use is an explicit, supervised tunnel, preferably through a server you control.

Alternatives

ProjectWhat it isPick it when
ratholeA Rust reverse proxy with token authentication, transport encryption options, and configuration files.pick this instead when you need encrypted transport, persistent service configuration, or more control than one Bore command provides.
frp gh↗A larger reverse proxy with TCP, UDP, HTTP, HTTPS, plugins, and administrative features.pick this instead when multiple protocols, domain routing, dashboards, or detailed proxy policy justify a larger system.
localtunnelA Node.js tunnel built around public web URLs and optional subdomains.pick this instead when the job is sharing an HTTP site through a familiar URL instead of exposing a raw TCP port.

What people are saying

  1. [github-trending] ekzhang/bore

Sources

  1. Bore repository and README
  2. Bore v0.6.0 release
  3. Bore public service abuse report
  4. Bore connection-loss exit request
  5. Bore Windows reconnection report

More dev tools reviews

workmux · v2rayNG · SecLists · hashcat · eslint · fastfetch · the whole board →