Advertisement · 728 × 90

Posts by Agent IO

"By leveraging Envoy as an agent gateway, organizations can decouple security and policy enforcement from agent development code." Google (partially) gets @agent.io -- they understand the potential but, as usual, miss the importance of simplicity! cloud.google.com/blog/product...

2 days ago 2 1 1 0
Preview
The case for Envoy networking in the agentic AI era | Google Cloud Blog In the world of AI agents, the Envoy networking proxy consistently enforces governance and security across all agentic paths, and at scale.

People at Google really like Envoy (so do we) cloud.google.com/blog/product...

2 days ago 0 0 0 0

Slink is infrastructure code that generates infrastructure code. To facilitate usage, it's now available under the most permissive OSS license.

1 week ago 1 0 0 0
Preview
GitHub - agentio/slink at v0.2.0 A tool for calling XRPC APIs, automatically generated from Lexicon. - agentio/slink

The slink CLI and code generator is now MIT-licensed.
github.com/agentio/slin...

1 week ago 6 0 1 0
Software Licenses and Workers' Rights The open source ladder is leaning on the wrong wall.

Software Licenses and Workers' Rights
agent.io/posts/softwa...

1 week ago 5 0 0 1
Build an ATProto PDS Build an AT Protocol PDS the hard way (from scratch).

On the decision to write a PDS agent.io/decisions/pds/

1 week ago 0 0 0 1
Managing a Beta with Bluesky How I use Bluesky to easily and securely preview a software product to users.

Managing a Beta with Bluesky agent.io/posts/managi...

2 weeks ago 1 0 0 1
Building a PDS the Hard Way Commits that could get me committed.

Building a PDS the Hard Way
agent.io/posts/buildi...

3 weeks ago 3 1 0 0
Advertisement

I've been building a new service that, like IO, uses an SSH port to take commands and display a TUI. When I deployed it to one of my Nomad-based servers, I realized that I needed a way to proxy the SSH port from my internal Nomad port to a public port on my server. Thus the new "tcp_port" config.

3 weeks ago 0 1 0 1
IO Configuration Reference Here’s how you can configure IO using its HCL-based configuration language.

New in IO: Direct TCP port configuration agent.io/io/config/#t...

3 weeks ago 0 0 1 0
Risks of DID:PLC It’s the cornerstone of identity on Bluesky. What could possibly go wrong?

Are you worried about DID:PLC? There are reasons to be, but they can be fixed agent.io/posts/risks-...

1 month ago 2 2 0 2
Better Go clients for ATProto Easily call XRPC APIs from your Go code and the command line.

Finally! The treatise about slink that no one was asking for but everyone needed agent.io/posts/slink

1 month ago 2 0 0 1
Preview
GitHub - agentio/statusphere: The ATProtocol Statusphere demo application on IO. The ATProtocol Statusphere demo application on IO. - agentio/statusphere

Finally (for now), here's our Statusphere app updated to use Slink. github.com/agentio/stat...

2 months ago 0 0 0 0
Preview
GitHub - agentio/chatter: A command-line tool that sends messages using the Bluesky Chat API. A command-line tool that sends messages using the Bluesky Chat API. - agentio/chatter

Slink also generates a Go client library that powers the CLI. We can use that in other Go programs like this tool that sends chat messages like the one above. github.com/agentio/chat...

2 months ago 0 0 1 0
# izakaya:~/Desktop/agentio/slink
$ CONVOID=$(SLINK_ATPROTOPROXY=did:web:api.bsky.chat#bsky_chat slink call chat.bsky.convo get-convo-for-members --members $(slink resolve did timburks.me) --members $(slink resolve did agent.io) | jq .convo.id -r)
# izakaya:~/Desktop/agentio/slink
$ echo $CONVOID
3md2h2kakjk22
# izakaya:~/Desktop/agentio/slink
$ vi message.json
# izakaya:~/Desktop/agentio/slink
$ cat message.json
{"text":"Here's your CLI-generated Bluesky chat message! I built a mechanically-generated CLI that calls XRPC functions. I'm using it to send you this with chat.bsky.convo.sendMessage"}
# izakaya:~/Desktop/agentio/slink
$ SLINK_ATPROTOPROXY=did:web:api.bsky.chat#bsky_chat slink call chat.bsky.convo send-message --convo-id $CONVOID --message message.json
{
  "id": "3mdjbt5flrc26",
  "rev": "2222224a7rehk",
  "sender": {
    "did": "did:plc:ahr5yhciwadehhwm7fotyfju"
  },
  "sentAt": "2026-01-28T22:06:03.745Z",
  "text": "Here's your CLI-generated Bluesky chat message! I built a mechanically-generated CLI that calls XRPC functions. I'm using it to send you this with chat.bsky.convo.sendMessage"
}

# izakaya:~/Desktop/agentio/slink $ CONVOID=$(SLINK_ATPROTOPROXY=did:web:api.bsky.chat#bsky_chat slink call chat.bsky.convo get-convo-for-members --members $(slink resolve did timburks.me) --members $(slink resolve did agent.io) | jq .convo.id -r) # izakaya:~/Desktop/agentio/slink $ echo $CONVOID 3md2h2kakjk22 # izakaya:~/Desktop/agentio/slink $ vi message.json # izakaya:~/Desktop/agentio/slink $ cat message.json {"text":"Here's your CLI-generated Bluesky chat message! I built a mechanically-generated CLI that calls XRPC functions. I'm using it to send you this with chat.bsky.convo.sendMessage"} # izakaya:~/Desktop/agentio/slink $ SLINK_ATPROTOPROXY=did:web:api.bsky.chat#bsky_chat slink call chat.bsky.convo send-message --convo-id $CONVOID --message message.json { "id": "3mdjbt5flrc26", "rev": "2222224a7rehk", "sender": { "did": "did:plc:ahr5yhciwadehhwm7fotyfju" }, "sentAt": "2026-01-28T22:06:03.745Z", "text": "Here's your CLI-generated Bluesky chat message! I built a mechanically-generated CLI that calls XRPC functions. I'm using it to send you this with chat.bsky.convo.sendMessage" }

A chat view showing the message that I just sent.

A chat view showing the message that I just sent.

Among many other things, you can use it to send Bluesky chat messages.

2 months ago 0 0 1 0
Preview
GitHub - agentio/slink: A tool for calling XRPC APIs, automatically generated from Lexicon. A tool for calling XRPC APIs, automatically generated from Lexicon. - agentio/slink

Here's a little CLI that generates itself from Lexicon and calls XRPC APIs. github.com/agentio/slink

2 months ago 1 1 1 1
$ ssh localhost -p 2200 -- get traffic -m calling -a digitaloceandns -l 1
{
  "log": {
    "version": "1.2",
    "creator": {
      "name": "IO",
      "version": "v0.1.75-f45f06b2*"
    },
    "entries": [
      {
        "startedDateTime": "2026-01-09T14:53:54-08:00",
        "time": 0,
        "request": {
          "method": "DELETE",
          "url": "/v2/domains/agent.io/records/1781875673",
          "headers": [
            {
              "name": ":authority",
              "value": "localhost:5000"
            },
            {
              "name": ":path",
              "value": "/v2/domains/agent.io/records/1781875673"
            },
            {
              "name": ":method",
              "value": "DELETE"
            },
            {
              "name": ":scheme",
              "value": "http"
            },
            {
              "name": "user-agent",
              "value": "curl/8.12.1"
            },
            {
              "name": "accept",
              "value": "*/*"
            },
            {
              "name": "x-forwarded-for",
              "value": "192.168.4.172"
            },
            {
              "name": "x-forwarded-proto",
              "value": "http"
            },

$ ssh localhost -p 2200 -- get traffic -m calling -a digitaloceandns -l 1 { "log": { "version": "1.2", "creator": { "name": "IO", "version": "v0.1.75-f45f06b2*" }, "entries": [ { "startedDateTime": "2026-01-09T14:53:54-08:00", "time": 0, "request": { "method": "DELETE", "url": "/v2/domains/agent.io/records/1781875673", "headers": [ { "name": ":authority", "value": "localhost:5000" }, { "name": ":path", "value": "/v2/domains/agent.io/records/1781875673" }, { "name": ":method", "value": "DELETE" }, { "name": ":scheme", "value": "http" }, { "name": "user-agent", "value": "curl/8.12.1" }, { "name": "accept", "value": "*/*" }, { "name": "x-forwarded-for", "value": "192.168.4.172" }, { "name": "x-forwarded-proto", "value": "http" },

Here we see that the disallowed request was blocked by IO, which returned a 403 (Forbidden) error

Here we see that the disallowed request was blocked by IO, which returned a 403 (Forbidden) error

Another thing that auth scopes don't provide is visibility into how auth tokens are used. So IO allows traffic histories to be exported as HAR files that show us all the approved and blocked requests.

3 months ago 0 0 0 0
calling "digitaloceandns" {
  name   = "Digital Ocean DNS"
  target = "api.digitalocean.com"
  port   = 5000
  require_apikey {
    users = <<END
fury:{SHA}czqgP91Ev45QGKCokt/+mBIHgn8=
hulk:{SHA}Mf6CeupM9fas594sId4LX2t4OFg=
END
  }
  apply_header "authorization" {
    secret = "vault:default/io/digitalocean-dns"
  }
  operation "retrieve-domain" {
    method = "GET"
    path = "/v2/domains/{domain}"
  }
  operation "retrieve-domain-records" {
    method = "GET"
    path = "/v2/domains/{domain}/records"
  }
  operation "retrieve-domain-record" {
    method = "GET"
    path = "/v2/domains/{domain}/records/{recordid}"
  }
}

calling "digitaloceandns" { name = "Digital Ocean DNS" target = "api.digitalocean.com" port = 5000 require_apikey { users = <<END fury:{SHA}czqgP91Ev45QGKCokt/+mBIHgn8= hulk:{SHA}Mf6CeupM9fas594sId4LX2t4OFg= END } apply_header "authorization" { secret = "vault:default/io/digitalocean-dns" } operation "retrieve-domain" { method = "GET" path = "/v2/domains/{domain}" } operation "retrieve-domain-records" { method = "GET" path = "/v2/domains/{domain}/records" } operation "retrieve-domain-record" { method = "GET" path = "/v2/domains/{domain}/records/{recordid}" } }

Auth scopes are great but they don't always restrict access as much as we want. Here's an IO configuration that *only* allows a couple of authorized API key users to call a few named methods of the Digital Ocean DNS API using a token that it gets from Hashicorp Vault.

3 months ago 1 0 1 0
Advertisement
Post image

Here's IO running on MacOS agent.io/decisions/ma...

3 months ago 1 1 0 0
Conform to the XDG Base Directory Specification Store IO state and temporary files in a standard location.

Are you familiar with the XDG Base Directory Specification? Here's how we used it to improve IO: agent.io/decisions/xdg/

3 months ago 0 0 0 0
Build Envoy and IO containers directly Use gcr.io/distroless and self-built Envoys to have more control and to reduce dependencies, vulnerabilites, and image size.

Recently we started building our own Envoy binaries and IO container images. agent.io/decisions/co...

4 months ago 0 0 0 0
Use CGO, libc, and pure SQLite. Since Envoy will always depend on libc, it seems reasonable for IO to also.

Envoy requires libc, so it doesn't make sense for IO to make performance sacrifices to avoid depending on libc itself. That lets us build IO with CGO and use the native SQLite library, which has big performance benefits. agent.io/decisions/cgo/

5 months ago 0 0 0 0
IO Configuration Reference Here’s how you can configure IO using its HCL-based configuration language.

This week IO's configuration language got a revamp and a reference agent.io/io/config/

5 months ago 0 0 1 0
Hold on Alpine Linux I love the ideas behind this lightweight distribution, but it’s challenging in practice.

Tempted by Alpine Linux: agent.io/decisions/al...

5 months ago 0 0 0 0
Build and Use Sidecar Replace Connect with a new, simple, transparent Go gRPC library.

In September we created Sidecar, a new Go gRPC implementation that focuses on clarity, simplicity, and security for apps that run with sidecars. It's now how IO does gRPC. Here's a discussion of our decision to switch. agent.io/decisions/si...

6 months ago 0 0 0 0
Out-of-Process SDKs Do you really want to put that vendor code in your app?

Is it an SDK... or a monster infesting your app? agent.io/posts/sdks/

6 months ago 0 0 0 1
Preview
GitHub - agentio/sidecar: Baggage-free gRPC for Go. Baggage-free gRPC for Go. . Contribute to agentio/sidecar development by creating an account on GitHub.

If you use Go, gRPC, and sidecar proxies, I wrote this for you github.com/agentio/sidecar

6 months ago 2 1 0 0
What can we learn with a simple gRPC service? Exploring gRPC and connectrpc with a simple echo service.

Echo is a simple gRPC service that we wrote to test and experiment with gRPC and ConnectRPC agent.io/posts/echo/

7 months ago 0 0 0 0
Advertisement
How IO runs on gRPC IO doesn’t just manage gRPC APIs, gRPC makes IO go.

How IO uses gRPC: agent.io/posts/grpc/

7 months ago 0 0 0 0
Drop Service Infrastructure Remove integration with Google’s Service Infrastructure APIs.

IO was created to work with a set of API management APIs from Google called Service Infrastructure, but now we think we've outgrown it. agent.io/decisions/dr...

7 months ago 0 0 0 0