type: decision
status: active
timestamp: 2026-07-02
tags: [ci, dagger, gha, hybrid, caching, architecture]

Hybrid Dagger+GHA architecture locked — 2026-07-02

Per-class Dagger modules in chirag127/workflows. GHA = 5-line adapter. Tauri Windows = GHA host for cargo, Dagger for portable parts. Both cacheVolume() + actions/cache.

Hybrid Dagger+GHA architecture

Locked decisions (2026-07-02 grill)

Module granularity

Per-class modules in chirag127/workflows.

screenpipe Tauri Windows build

Dagger for portable parts, GHA host for cargo/Tauri.

Tauri Windows builds CANNOT run in Dagger containers because:

Therefore:

If Dagger ever ships stable Windows container support + GHA windows-latest ships Docker → revisit.

Caching strategy

Both Dagger cacheVolume() + actions/cache@v4.

WhatWhere
npm/bun packages inside Dagger containersdag.cacheVolume("bun-cache")
Cargo registry on GHA Windows hostSwatinem/rust-cache@v2
bun install cache on GHA Windows hostactions/cache@v4
Next.js build cache on GHA Windows hostactions/cache@v4

Keys: v1-rust-win-<Cargo.lock hash>, bun-next-<runner.os>-<bun.lock hash>

Conversion scope

All workflows: chirag127/workflows (7 reusable) + screenpipe build-windows-personal.yml + umbrella deploy.yml.

The pattern (reference)

# .github/workflows/ci.yml — 5-line adapter (thin)
name: ci
on: [push, pull_request]
jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dagger/[email protected]
        with:
          version: latest
          call: ci --source=.
// dagger/<class>/src/index.ts — all logic here
@object()
export class AstroSite {
  @func() async lint(source: Directory): Promise<string> { ... }
  @func() async typecheck(source: Directory): Promise<string> { ... }
  @func() async test(source: Directory): Promise<string> { ... }
  @func() build(source: Directory): Directory { ... }
  @func() async ci(source: Directory): Promise<string> {
    await Promise.all([this.lint(source), this.typecheck(source), this.test(source)])
    await this.build(source)
    return "ok"
  }
}

Cross-refs


Edit on GitHub · Back to index