Codebase map

A quick index for finding your way around. Full Go API docs are on pkg.go.dev.

cmd/pdf-server

FileContents
main.goCLI app, subcommands, logger bootstrap.
server.go / validate.goThe two subcommand actions.
wire.goInjector declarations (wireinject tag).
wire_bindings.goThe single wireSet: providers + bindings.
wire_gen.goGenerated graph (read this for the object graph).
config.goFlag binding into config structs.

app/

PackageKey types
serverHandlers, EchoRouter, middleware, swagger.go.
servicesBasePDFRenderService, SimpleValidateService, DirectStatsService, TemplateSpecService, domain errors.
templatesTemplate, CompositeTemplate, Store/LazyStore, Validator, futures/.
templates/fileloaderFileTemplateLoader, engines, sibling loaders, composition/, remote/, helpers/.
pdfrenderPDFRenderer, Config, Document, WaitLifecycleEvent.
pdfrender/cdppool.go, factory.go, runner.go, page.go, render.go, config.go.
pdfrender/serverInternal callback server + document store.
configGlobalConfig aggregation.
loglogrus wrapper, context accessors, field constants.
utils/trace_utilsOTel providers, samplers, propagators.

Generated code

  • .gen/ — a Make stamp for wire_gen.go; test/lint/build depend on it.
  • mocks/ — mockery output mirroring app/; tests import from here.

Design diagrams

design/main_flow.puml, design/services.puml, design/templates.puml.

Conventions worth internalising

  • Thread ctx everywhere; get loggers via log.LoggerFromContext(ctx, name).
  • Open spans with tracerProvider.Tracer("Name") + tracer.Start(ctx, "op").
  • Domain errors implement Is/Unwrap; map to HTTP only in server.Handlers.buildError.
  • Render concurrency == browser pool size (RENDER_POOL_MAX_TOTAL).