A modern take on the finger protocol. Maintain a ~/.plan file, sign it with Ed25519 keys, sync it to a relay. Anyone can fetch
your plan and learn about you or see what you're working on.
The default public relay is https://winger.wingman.actor.
Users keep a ~/.plan file locally. Every sync cryptographically signs the content and pushes it to a relay server. No accounts, no passwords — just a handle tied to your public key.
Anyone can read anyone's plan, just like the original finger protocol.
go install github.com/ChaseRensberger/winger/cmd/winger@latest
winger init # generate keys, pick a handle, register with relay
winger sync # sign and push ~/.plan to relay
winger daemon # watch ~/.plan and auto-sync on changes
winger <handle> # look up someone's plan
winger init does~/.winger/identity.key and ~/.winger/identity.pub~/.winger/config.toml~/.plan file~/.winger/
identity.key # Ed25519 private key
identity.pub # public key
config.toml # relay URL, handle
~/.plan # your plan file
The relay is the server that stores and serves plan files. It exposes both a JSON API (for the CLI) and an HTMX web UI.
# build css
bun install
bunx @tailwindcss/cli -i input.css -o static/output.css
# start relay
go run ./cmd/relay
The relay listens on :2323 by default. Set PORT and DB_PATH environment variables to customize.
| Method | Route | Description |
|---|---|---|
POST | /register | Register a handle with a public key |
POST | /sync | Upload a signed plan |
GET | /{handle} | View a plan (text/plain from CLI, HTML from browser) |
GET | /random | View a random plan |
GET | / | Leaderboard — top plans by retrieval count |
GET | /leader | Leaderboard alias |
Push to GitHub and connect to Render. The included render.yaml configures a web service with a persistent disk for the SQLite database.
.plan[chase]
Plan:
This is my daily work ...
When I accomplish something, I write a * line that day.
Whenever a bug / missing feature is mentioned during the day and
I don't fix it, I make a note of it. Some things get noted many times
before they get fixed.
Occasionally I go back through the old notes and mark with a +
the things I have since fixed.
= mar 21 ===================================
* winger init flow
* ed25519 key generation
* relay with sqlite storage
* htmx leaderboard
+ plan retrieval counter
3 commits
Go
84.3%
HTML
11.2%
CSS
2.6%
Dockerfile
1.8%
A modern take on the finger protocol. Maintain a ~/.plan file, sign it with Ed25519 keys, sync it to a relay. Anyone can fetch
your plan and learn about you or see what you're working on.
The default public relay is https://winger.wingman.actor.
Users keep a ~/.plan file locally. Every sync cryptographically signs the content and pushes it to a relay server. No accounts, no passwords — just a handle tied to your public key.
Anyone can read anyone's plan, just like the original finger protocol.
go install github.com/ChaseRensberger/winger/cmd/winger@latest
winger init # generate keys, pick a handle, register with relay
winger sync # sign and push ~/.plan to relay
winger daemon # watch ~/.plan and auto-sync on changes
winger <handle> # look up someone's plan
winger init does~/.winger/identity.key and ~/.winger/identity.pub~/.winger/config.toml~/.plan file~/.winger/
identity.key # Ed25519 private key
identity.pub # public key
config.toml # relay URL, handle
~/.plan # your plan file
The relay is the server that stores and serves plan files. It exposes both a JSON API (for the CLI) and an HTMX web UI.
# build css
bun install
bunx @tailwindcss/cli -i input.css -o static/output.css
# start relay
go run ./cmd/relay
The relay listens on :2323 by default. Set PORT and DB_PATH environment variables to customize.
| Method | Route | Description |
|---|---|---|
POST | /register | Register a handle with a public key |
POST | /sync | Upload a signed plan |
GET | /{handle} | View a plan (text/plain from CLI, HTML from browser) |
GET | /random | View a random plan |
GET | / | Leaderboard — top plans by retrieval count |
GET | /leader | Leaderboard alias |
Push to GitHub and connect to Render. The included render.yaml configures a web service with a persistent disk for the SQLite database.
.plan[chase]
Plan:
This is my daily work ...
When I accomplish something, I write a * line that day.
Whenever a bug / missing feature is mentioned during the day and
I don't fix it, I make a note of it. Some things get noted many times
before they get fixed.
Occasionally I go back through the old notes and mark with a +
the things I have since fixed.
= mar 21 ===================================
* winger init flow
* ed25519 key generation
* relay with sqlite storage
* htmx leaderboard
+ plan retrieval counter
3 commits
Go
84.3%
HTML
11.2%
CSS
2.6%
Dockerfile
1.8%