We use Go where PHP stops being the right tool: high-throughput services, background workers, network-intensive processing and software that should run lean. Go compiles to a single binary and its goroutines make concurrent work cheap — which is why NetPostPanel's heavy lifting is written in it.
What we build in Go
- AI-processing microservices — NetPostPanel runs provider orchestration, RAG retrieval and semantic filtering as Go services that fan out concurrent LLM calls.
- Scrapers and data pipelines — crawlers that fetch, parse and normalize content at rates PHP workers can't match.
- Internal APIs and webhook processors — small services beside a Laravel monolith that take the load it shouldn't carry.
- CLI tools — importers, deployment helpers and maintenance utilities that compile to one binary.
How it sits next to PHP
The Laravel app handles what it's good at — HTTP, auth, admin, billing. Go services handle fan-out concurrency and CPU-heavy work. They talk over HTTP, queues and webhooks.
Fan-out in a dozen lines
func fetchAll(ctx context.Context, urls []string) []Result {
results := make(chan Result, len(urls))
var wg sync.WaitGroup
for _, u := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
results <- fetch(ctx, url)
}(u)
}
wg.Wait()
close(results)
return slices.Collect(results)
}
The actual concurrency pattern behind NetPostPanel's provider calls — no framework, just the standard library.
Our Go code is intentionally boring: standard library first, minimal dependencies, structured logging, graceful shutdown, Dockerfile included. If you have a PHP bottleneck that keeps growing, or a service that should live outside the monolith — that's a good reason to talk.