Loading · Go
Stack Innovations/ Services/ Custom Development/ Go
03 / 08 · Custom Development
000Building Go

Go

Bespoke Go services, engineered for the ten-year arc.

Start a build
The argument

A Go service is just goroutines that know how to wait.

Each goroutine · a worker. Each channel · a contract. Each select · a decision held.
02 — Ecosystem

Go,
and the right neighbours.

Language/01
Go 1.2x

Goroutines, channels, and a standard library that rarely needs replacing.

ConcurrencyStdlibStatic binary
Framework/02
net/http + chi

The standard library is usually enough; chi for routing sugar when it isn't.

RoutingMiddleware
Data layer/03
sqlc

Generates typed Go from raw SQL — no ORM magic to debug.

CodegenSQL
Postgres driver/04
pgx

The fastest, most complete Postgres driver in the ecosystem.

PoolingCOPY
Concurrency/05
Goroutines + channels

CSP-style concurrency built into the language, not bolted on.

CSPselect
RPC/06
Protobuf + gRPC

Typed, fast service-to-service calls for internal APIs.

HTTP/2Codegen
Testing/07
testify

Assertions and mocks on top of Go's built-in testing package.

assertmock
Linting/08
golangci-lint

Dozens of linters in one fast, CI-friendly binary.

CIvet
Dev tooling/09
Air

Live reload for local development.

ReloadWatch
Deploy/10
Docker · scratch/distroless

Static binaries in minimal images — often under 20MB. No runtime, no surprises.

Multi-stageMinimal imageCGO_ENABLED=0
Observability/11
OpenTelemetry

Tracing and metrics, first-class in the Go ecosystem.

TracesMetrics
03 — What we build

Three shapes,
one toolkit.

01 — APIs
APIs &
microservices.

High-throughput backends. Typed handlers, connection pooling, graceful shutdown — wired to scale from day one.

  • REST & gRPC handlers · typed end to endchi
  • Connection pooling · bounded concurrencypgxpool
  • Auth · JWT, mTLS service-to-serviceRBAC
  • Graceful shutdown · context cancellationSIGTERM
GET /v1/orders handler.go pgxpool grpc.Server
02 — CLIs & tooling
CLIs & infra
tooling.

Single static binaries, cross-compiled. No runtime to install, no dependency drift — just `go build` and ship.

  • Cross-compiled · linux/darwin/windowsGOOS/GOARCH
  • Flag parsing · subcommandscobra
  • Self-updating · signed releasesgoreleaser
  • Zero dependencies · single binaryCGO_ENABLED=0
$ go build -o bin/svc ./cmd/svc $ ./bin/svc serve --port 8080 listening on :8080 binary size: 14.1MB
03 — Real-time
Real-time &
streaming.

High-concurrency, low-latency systems. Thousands of goroutines, one shared event loop's worth of clarity.

  • WebSocket fan-out · 10k+ connectionsgorilla/ws
  • Worker pools · bounded goroutineserrgroup
  • Backpressure · buffered channelsselect
  • Stream processing · low GC pressuresync.Pool
t0 t+30s t+60s
/ Phase 01 · Discover

Listen first.

Stakeholder interviews, support tickets, on-call history. We map the service boundaries by mapping the work.

Discovery docTech auditRisk map
SCOPE LOAD DATA TEAM RISK OUTCOME
cmd/ cmd/api/main.go internal/order/service.go internal/order/repo.go internal/http/router.go pkg/middleware pkg/telemetry
type OrderStore interface { Get(ctx, id) (Order, error) type Order struct { ID string; Total int64 message Order { string id = 1; } service Orders { rpc Get(...) } // protoc --go_out=. orders.proto internal vs exported · package boundary go vet · go build ./...
// handler.go func (s *Server) GetOrder( w http.ResponseWriter, r *http.Request, ) { ctx := r.Context() o, err := s.store.Get(ctx, id) if err != nil { ... } } → goroutine-safe · no shared mutable state → traced · otel span per request → tested · table-driven + race detector
w1 w6 w12 -71% p99 latency
01
01
05
05 — Architecture

A request,
end to end.

// live · GET /v1/orders?status=open
Request Static
Client HTTP · gRPC Service consumer Load Balancer L7 · health checks ~4ms hop Go service goroutine pool chi · context Postgres pgx pool Read replicas Observability OpenTelemetry Logs · Traces · Metrics
Client → LB~4ms
LB → Service~6ms
Service → DB~3ms
Round-trip · p999ms
06 — Numbers

Standards,
not anecdotes.

What every Go build leaves with — the floor, not the ceiling.

Median p99 latency 0 ms · across last 12 builds
#StandardFloorMethod
01 p99 latencyproduction · last 30d 0ms RUM
02 Binary sizescratch/distroless image 0MB docker
03 Goroutine leaksper service · steady state 0 pprof
04 Test coverageunit + integration 0% go test
05 Build timeCI · cold cache 0s CI
06 GC pauseSTW · p99 0ms pprof
08 — Engagement

Three ways
to start.

01 / Sprint2 weeks
Diagnostic
sprint.
flatfixed scope
  • Tech audit · current Go stack
  • Architecture proposal
  • Risk & cost map
  • Live walkthrough · written report
Book a sprint
02 / MVP— Most chosen
MVP ship.
retainer4–8 weeks
  • One service, end to end
  • Auth · Observability · CI wired
  • Package layout seed · internal/ + pkg/
  • CI/CD · monitoring · runbook
  • Two rounds of post-launch iteration
Start an MVP
03 / Build12+ weeks
Ground-up
platform.
retainerquarterly
  • Multi-service platform
  • Internal admin + public API
  • Embedded design partner
  • Hand-off plan, onboarded team
Plan a build
09 — Questions

Things people
actually ask.

Go trades some scripting flexibility for predictability: a static binary with no runtime to install, goroutines that make concurrency cheap instead of callback-heavy, and a GC tuned for low, consistent pause times. For high-throughput APIs, CLIs, and anything that needs to run the same way in every environment, that trade pays off fast.
We default to net/http plus chi for routing sugar — the standard library's HTTP server, context handling, and middleware pattern cover most needs without an opinionated framework on top. We reach for something heavier only when a project's surface area genuinely calls for it.
In-process goroutines with worker pools and errgroup for anything that lives and dies with a request. For durable, retryable background jobs — emails, webhooks, scheduled tasks — we reach for a Redis-backed queue like Asynq so work survives a restart.
REST/JSON for anything public-facing or browser-consumed — it's debuggable with curl and needs no special tooling. gRPC for internal service-to-service calls where typed contracts, streaming, and HTTP/2 multiplexing actually matter. Most platforms end up using both, at different boundaries.
Yes — a large share of our work is brownfield. We start with a tech audit, run `go vet` and the race detector across the existing code, identify the safe seams, and ship into the running service behind feature flags. No big-bang rewrites.
Table-driven tests with the standard `testing` package and testify for assertions, run with `-race` in CI on every PR. Integration tests spin up real Postgres via containers rather than mocking the database. Nothing merges if the suite — or the race detector — is red.
10 — Start

Let's build
something worth shipping.

Two-week diagnostic, four-week MVP, twelve-week ground-up. Bring the brief — we'll send a plan, not a pitch deck.

Start a project
Tweaks
Accent
Motion
Lenis
Sound