Open-source development infrastructure

HTTPS for
wherever
you build.

Stable .test names for projects running in containers, VMs, WSL, or remote machines. One host handles DNS, certificates, and routing.

testd run app.example:3000
Linux / macOS / Windows ISC licensed No telemetry
Route specimen / 001 Live
Dev environmentContainer:3000
Host machinetestd hostDNS + TLS + proxy
Browser200 OKHTTPS
Plain TCP / :7737 TLS / :443
https://app.example.test Secure
One small binary. The whole route.

00 / THE PREMISE

One less layer between you and the thing you’re making.

Development already has enough moving parts. Your naming layer shouldn’t add more.

  • No per-project /etc/hosts edits
  • No certificate files to choreograph
  • No Caddy required in the runtime path

01 / HOW IT WORKS

Your machine is the host.
Your app stays where it is.

Run the daemon on the machine with your browser. Each dev environment registers over a single outbound connection.

01Browser machine

Open a real name.

app.example.test

The browser resolves .test to your host and connects over trusted HTTPS.

02testd host

One local authority.

DNSLocal CAHTTPS edge

Resolves the name, mints a short-lived certificate, and proxies to the live target.

03Dev environment

Keep building.

testd run :3000

Your app remains in its container, VM, WSL instance, or remote box. HMR works too.

↳

The connection is the lease. Stop the process or close the terminal, and its names disappear. No stale routes. No cleanup job.

Claims, grants & tokens

02 / AT A GLANCE

A live view.
Not another
control plane.

The loopback dashboard keeps the useful things close: names, targets, shares, access requests, tokens, and certificate health.

  • 01
    Live by default

    Updates stream in without a reload.

  • 02
    Local by design

    Read-only without its per-run control token.

  • 03
    Ready when you are

    Also available from the cross-platform tray app.

Explore the dashboard
⌁ 127.0.0.1:7737
LOCAL
WORKSTATION / OVERVIEW

Good routes, all round.

LIVE
Live names03
Active shares01
Access requests01
Live namesTarget
A
app.examplehttps://app.example.test
10.0.0.5:3000
↗
api.examplehttps://api.example.test
10.0.0.5:8080
D
docs.examplehttps://docs.example.test
127.0.0.1:4173
Access requestNOW
mara@devbox:exampleworker.example
ApproveDeny

03 / THE DETAILS

Small surface.
Solid foundations.

Purposeful defaults for everyday development, with escape hatches when your setup gets interesting.

LOCAL HTTPS01

Certificates, handled.

A local CA mints leaf certificates on demand. They live for 24 hours; the root key never leaves your host.

REMOTE DEVELOPMENT02

Your environment can be elsewhere.

Connect containers, VMs, WSL, and remote boxes. Named profiles remember your hosts; reconnects reuse approved grants.

Multi-host profilesWebSockets + HMR
SCOPED ACCESS03

Permission, name by name.

Approve a new environment once. Issued tokens cover exact names, persist across reconnects, and can be revoked without disturbing others.

Read the trust model
QUICK LAUNCHES04
$npm run dev

From saved command to live name.

Start projects from the dashboard or tray. testd can detect the listening port, probe the target, and register when it is ready.

05 / CLEAR BOUNDARIES

Local means local.

No account system. No central service. No telemetry, usage reporting, or name reporting.

01

Root key stays home

Your CA private key remains on the host, never in a dev environment.

02

Dashboard on loopback

Administrative actions need a per-run token. The edge never proxies the dashboard.

03

Remote targets constrained

Remote leaves can target only their own address unless you explicitly opt in.

04

Plainly documented

Registration uses plain TCP. Use a trusted network or encrypted transport; never expose :7737 publicly.

Read the complete security model

06 / QUICKSTART

From zero to HTTPS
in three moves.

Set up the host once. Then give every project a name with a single command.

Download a release
  1. 01

    Prepare the host

    Create the local CA, configure the resolver, and start the daemon.

  2. 02

    Name your project

    Run the command where your app lives. Add your dev command after -- to tie their lifetimes together. A new remote environment asks for one approval on the host.

  3. 03

    Open the address

    Your browser gets a stable, trusted URL. Keep the command running; stop it to release the name.

    https://app.example.test
your-project · zsh80 × 24
01 / ON THE HOST
# once, to prepare this machine
testd init
testd doctor --fix

# keep the host running
testd host
02 / IN YOUR PROJECT
testd run app.example:3000 \
  -- npm run dev
→
app.example registered
https://app.example.test

Installing from source? Clone the repository and run cargo install --path .. Linux port 443 requires a capability or a high port. Full installation notes

MADE BY LAPILLI WORKS

Lapilli

Lapilli, Latin for “little stones”: fragments formed in a volcanic eruption.

We are a software studio making considered software and SaaS: good design, high quality, a human touch, and an unconventional point of view.