ADR-0016: stackr in lattice¶
Status: Accepted, amended by ADR-0018 Date: 2026-09-30 Deciders: Alex Nodeland
Amends ADR-0003, how Grafana gets the libraries' dashboards; ADR-0009, what keeps PostgreSQL at Supabase's major version; ADR-0011, where Copier finds the template and when CI generates it; and ADR-0012, what moves the images' tags.
Context¶
stackr was a repository of its own. Copier found its template through the copier.yml at that repository's root; its CI generated the template's applications and started the stack on every pull request; Grafana provisioned the libraries' dashboards from their releases, by version; and Dependabot kept its images current. On 2026-09-30 it moved, with its history, into lattice, the packages' one repository, as RFC-0003 designed. The template's pins of the libraries are RFC-0003's phase 4, and ADR-0013 stands until then.
Decision¶
- stackr is
packages/stackr, a member of lattice's uv workspace that builds nothing, whose tools come from lattice's oneuv.lock. It keeps its Makefile for the stack, lessinstall,docsanddocs-serve, which are lattice's, andchangeloganddashboards, which retired with git-cliff and the dashboards' releases. Its checks are moon tasks:validateandreferencemake up itscheck, andtemplate,smokeandsmoke-appare CI's Template and Smoke jobs. - Copier finds the template from lattice's root (ADR-0011's "
copier.ymlat the repository's root"). lattice's rootcopier.ymlincludespackages/stackr/copier.ymland sets_subdirectory: packages/stackr/template, so an application is generated withuvx copier copy gh:alexnodeland/lattice my-app. stackr's scripts render the template from lattice's root, where Copier sees a repository. lattice's tags are prefixed, as instackr-v0.1.0, so Copier finds no release of the template and takesHEAD. - Template and Smoke run when their own inputs change (ADR-0011's "on every pull request"): Template when stackr's files, lattice's
copier.ymloruv.lockdo, and Smoke when stackr's files do (lattice ADR-0002). Until phase 4, the template pins the libraries at revisions of their old repositories, so no change in lattice's libraries can reach what it generates. - Grafana gets the libraries' dashboards from the checkout (ADR-0003's "pinned by release").
compose.yamlmountspackages/artifactr/deploy/grafana/dashboardsand reflexr's, each as a folder of its own beside stackr's.scripts/fetch-dashboardsand its pins inversions.envretire. - Renovate keeps the images current (the Dependabot of ADR-0009 and ADR-0012), from lattice's own Actions (lattice ADR-0005).
renovate.jsonholds PostgreSQL at major 17, the version local Supabase runs, as Dependabot did, andscripts/check-config supabasestill fails on a mismatch. Renovate moves the images' tags as Dependabot did, so the reference pages still name the images without them. - release-please releases stackr as
stackr-v<version>, with its changelog. stackr ships no wheel (lattice ADR-0006).
Consequences¶
- Easier: the template and the libraries it generates applications on are in one repository, which phase 4 needs to test them together.
- Easier: a stack shows the dashboards of the libraries in its own checkout.
- Harder: Copier's documentation recommends one template per repository, since tags are shared. The prefixed tags keep stackr's apart, at the cost of template releases Copier can see (RFC-0003's unresolved questions).
- Harder: until phase 4, an application generated from lattice installs the libraries from their old repositories.