Products / Kismet

Kismet

Your process, on the internet. Securely.

Tell Kismet your app is flowershop.com on port 3000. It gets the certificate, takes the public traffic and routes it to your app, on one server or many.

  1. 01

    One thing to install

    Reverse proxy, certificates, load balancing, service discovery, an encrypted relay and a secret store, in one binary. No configuration files, service definitions or templates.

  2. 02

    Grow without a migration

    When the shop grows, add a second server with the same binary. Members find each other, share the work and cover for each other's failures.

  3. 03

    Keys that never touch disk

    In a cluster, each certificate's private key is held in memory by three members and sealed to each one. Nothing to back up, nothing to steal from a disk.

See it

Put an application on the internet:

kismet serve --standalone
kismet expose accounts --domain accounts.example.com --target 127.0.0.1:3000

Instead of

Pricing

Priced for your deployment

Kismet is licensed commercially by Frogfish LLC. Tell us what you want to run, and where, and we'll come back with a price.

Ask for a price

The details

Everything Kismet does

Kismet is a single binary that makes running processes publicly reachable over HTTPS. An application says "I am flowershop.com, I listen on port 3000." Kismet gets the certificate, accepts the public traffic and routes it to the application.

Run one copy and it works. Run several and they find each other, share the work and cover for each other's failures.

At a glance

  • One binary, about 26 MiB, written in Rust. Version 0.2.0, build 5.
  • Reverse proxy, certificate automation, load balancing, service discovery, encrypted cross-machine relay and secret store, all in one process.
  • No configuration files, service definitions or templates.
  • Clustered members keep their state in memory and write nothing to disk, private keys included.
  • Joining a cluster takes one command and one credential.
  • Made by Frogfish. Official binaries are licensed under the Frogfish Binary License 1.0.

Who it is for

Someone who rents a cloud server and wants flowershop.com to work. They install one thing, point their domain at it, and they are done.

When the shop grows they add a second server, then a third, with the same binary. There is no new component to run, and no migration to a "real" setup.

Larger operators get the same properties: no key material at rest in a cluster, no external dependencies, and failure behaviour that fits in a table.

Why it matters

Putting an application on the internet with automatic TLS, health-aware routing and failover usually means running several systems at once. Most of the configuration those systems need is not anyone expressing intent. It is separately built systems agreeing on what one sentence meant, with the operator carrying messages between them.

When one component owns the whole path from public address to local port, that negotiation goes away, and the configuration goes with it. So do the monthly load balancer bill, the storage to back up and the extra systems to keep running.

What it does

Reverse proxy. HTTP and HTTPS to local or remote application instances, with hostname routing, health checks and WebSocket support. Bodies stream rather than being held whole. Forwarded client identity comes from Kismet itself, whichever member a request arrives at.

Automatic certificates. A registered hostname gets a publicly trusted certificate through ACME HTTP-01. Certificates renew before they expire, the new one is served without a restart, and renewals are paced and jittered so a fleet never stampedes a certificate authority.

Load balancing across machines. Every member is an entry point and can reach every healthy instance in the cluster: a local one if there is one, otherwise over the encrypted relay to the member beside the application. Applications never need to be reachable from the public network.

Failover. If an instance refuses a connection, the request goes to another instance. A member that dies is routed around and its registrations are withdrawn.

A public address that follows a living member. A cluster can hold one of its provider's addresses itself. If the member holding it dies, another claims it through the provider's API, and the provider decides any dispute. DigitalOcean reserved IPs are built in, and any other provider works through an endpoint of your own.

Keys held in memory. In a cluster, each certificate's private key is held in memory by three members and sealed to each one individually, so other members cannot read it. They pass TLS connections to a holder unopened. When a holder dies, the key is held by three live members again without reissuing the certificate.

Secrets. A cluster keeps a service's secrets sealed in memory on three members and gives them only to callers whose token names that service. Membership of the cluster grants nothing.

Graceful stops. A member told to stop finishes the requests in flight, over HTTP and HTTPS, within a bounded grace.

Built-in PKI. The binary issues its own credentials. Applications register over a control API with mutual TLS and scoped tokens, and a fresh machine is claimed with one command over SSH.

Answers about itself. kismet explain says whether a hostname routes and whether it can be served over HTTPS right now, with the certificate's expiry and its last failure.

How you run it

How What you get
kismet serve Clustered by default. One machine is a cluster of one.
kismet serve --standalone One machine, with state kept on disk. Survives reboots and keeps its certificates.
kismet join on more machines The fabric. Members cover for each other, and a returning member catches up from the others.
kismet serve --standalone
kismet expose accounts --domain accounts.example.com --target 127.0.0.1:3000

Adding a machine to a cluster:

kismet pki issue --subject prod --join > join.json
KISMET_JOIN=join.json kismet join 10.0.0.1

kismet run registers an application for as long as a child process runs.

Durability is a dial

In a cluster there is no storage layer. Durability comes from how many copies are running, and the operator chooses that number. With two or three members, one can die and the survivors hold the state; when it returns, it rejoins and catches up.

What it replaces

Concern Conventionally Kismet
Public entry point Cloud load balancer Any member, with the address moved when one dies
Reverse proxy nginx, Caddy, Traefik Built in
Service discovery Consul, etcd, DNS-SD Built in
Certificates cert-manager, certbot Built in
Reaching another machine Overlay network, service mesh Built in, over an encrypted relay
Secret delivery Vault Built in, sealed in memory
Glue Annotations, service definitions, policies, target groups None

Compared to others

nginx and certbot. Two tools and a configuration file per site, on each server, with nothing shared between servers. With Kismet the application registers once and every member can serve it.

Caddy. The closest on one machine: also a single binary with automatic HTTPS. Caddy's routes come from its configuration, and a Caddy cluster shares certificates through a storage backend. In Kismet applications announce themselves, and members share certificates in memory with no shared storage.

Traefik. Discovers services from a platform such as Docker, Kubernetes or Consul, which you run alongside it. Kismet does its own discovery and needs no platform underneath.

Kubernetes ingress and cert-manager. These assume a Kubernetes cluster and the people to run one. Kismet gives one rented server, or three, the same result with one binary.

Cloud load balancers. A monthly bill, an extra hop and another thing to configure, in front of an ingress that already knows which instances are healthy. In Kismet the cluster is the load balancer.

Consul and Vault. Each is its own cluster with its own durable storage to run. Kismet builds in the discovery and secret delivery this job needs, with memory replicated between members and nothing to back up.

Cloudflare Tunnel and ngrok. Your traffic passes through someone else's network, which typically terminates TLS there. Kismet runs on your own machines, with your own addresses, and holds your own keys.

What it costs to run

Measured on a fast desktop limited to 1 CPU and 500 MiB, with a stand-in application on the same CPU:

Idle, one application registered 17.6 MiB
1,000 idle TLS connections 43.6 MiB
900 requests in flight at once 74.3 MiB
Highest seen across every run 82.1 MiB, about 16% of the limit
Requests a second, 10 concurrent 14,695
Requests a second, 50 concurrent 11,472
Requests a second, 200 concurrent 9,682

On a real 1 vCPU machine, one request at a time, Kismet added about 0.5 ms at p50: 6.8 ms through Kismet against 6.3 ms straight to the application.

Tens of millions of bad or abandoned requests cost effectively no memory.

How it is proven

Each capability has a test that runs through the shipping binary:

  • real certificate issuance against a local ACME server;
  • three members in containers, with a real partition and heal;
  • four members sharing certificates against an ACME server;
  • three members moving an address through a stand-in provider;
  • four members, reading a secret through a member that does not hold it.

It has also run on real infrastructure: DigitalOcean machines, a real reserved IP, a real Let's Encrypt certificate and a real network.

Works with

Gump schedules and supervises applications, and can announce them to Kismet on their behalf over the Hiccup protocol. Kismet needs no scheduler: an application with a credential and a port needs nothing else.

Meerkat, the Frogfish control panel, has a Kismet plugin. Operators see the cluster, every hostname and certificate, and can withdraw an instance, on a separate operator API that shares no authority with the control API.

More from Frogfish