Open tools, written in Go

Small, sharp tools for people who publish on the web.

Saasuke Labs builds three tools that work alone and fit together: a static site generator, a diagrams-as-code engine and a comment system you host yourself.

The tools

Three projects, one publishing workflow

Each one is a single Go binary with no runtime to install. Docs live with each project and are published here.

Gengo

Static site generator

Turns Markdown, HTML templates and one YAML manifest into a static site. This site is built with it.

  • Pages rendered in parallel, with a plain mode for CI
  • Diagrams and charts in Markdown through Nagare
  • Pull data from any HTTP API at build time
$ gengo generate
$ gengo serve --watch

Nagare

Diagrams as code

A small text language that renders architecture diagrams and charts to SVG, so they live in version control next to the code.

  • Use it as a CLI, an HTTP server or a Go library
  • One visual system for every component
  • Transparent canvas that sits on any page background
web:Browser(text: "Shop")
api:Server(title: "API")

web.e --> api.w

Kotomi

Comments for static sites

Comments and reactions for pages that have no backend. Run one container, embed a widget, moderate from an admin panel.

  • Self-hosted, with SQLite or Firestore storage
  • Several sites managed from one instance
  • Optional AI-assisted moderation
$ docker build -t kotomi .
$ docker run -p 8080:8080 kotomi

Better together

From a text file to a page people can talk about

01 · DRAW

Describe the diagram

Write a Nagare block inside your Markdown. No exported images to keep in sync.

02 · BUILD

Generate the site

Gengo renders the Markdown, the diagrams and any build-time data into plain static HTML.

03 · DISCUSS

Add the conversation

Drop the Kotomi widget into your template and readers can comment and react on every page.

Nagare in practice

This diagram is twenty lines of text

A checkout flow with a gateway, a VM, a queue and a database whose lights blink on every write and read. No drawing tool, no exported image: the text beside it is the whole source.

https://shop.example.comCheckout gatewayPOST /orders prod@ubuntuorders-apigolang · :8080 mailersend-receipt · @e… orderspostgres order.creatednats
Rendered by Nagare. Arrows come from the request lines; the database lights are animated from the last two.
@layout(w:1000,h:450)

shop:Browser(url: "https://shop.example.com", text: "Checkout", x:30,y:120,w:230,h:170)
gw:APIGateway(title: "gateway", method: "POST", route: "/orders", x:310,y:&shop.c,w:180,h:60)
vm:VM(title: "prod@ubuntu", x:540,y:40,w:430,h:200) {
    api:Server(title: "orders-api", icon: "golang", port: 8080, x:30,y:60,w:170,h:50)
    mailer:BackgroundWorker(title: "mailer", job: "send-receipt", x:240,y:60,w:160,h:50)
}
db:Database(title: "orders", engine: "postgres", x:570,y:300,w:120,h:120)
events:MessageQueue(title: "order.created", kind: "nats", x:770,y:325,w:200,h:70)

@shop.request(target: @gw)
@gw.request(target: @api)
@api.request(target: @db)
@api.request(target: @mailer)
@mailer.request(target: @events)

@db.write(begin:"0.5s",dur:"1.5s")
@db.read(begin:"2.5s",dur:"1.5s")

More Nagare examples →

Shipping

Latest releases

All release notes →