Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
bdb1c1d
test: add comprehensive tests for sandbox-host, control-plane, and fl…
aspectrr Feb 15, 2026
22d9565
fix: add in sandbox-host and control-plane
aspectrr Feb 16, 2026
823d003
fix: remove landing-page
aspectrr Feb 17, 2026
5694220
fix: fix ci stuff
aspectrr Feb 17, 2026
c002ec8
fix: fix linting
aspectrr Feb 17, 2026
68d021a
feat: replace WebSocket demo with scripted self-playing terminal anim…
aspectrr Feb 17, 2026
4867573
fix: delete demo server, make cli demo better
aspectrr Feb 17, 2026
883044e
feat: add comprehensive api test suite, billing, sdk, and web features
aspectrr Feb 18, 2026
62d6366
fix: replace hardcoded OAuth state with crypto nonce to prevent CSRF
aspectrr Feb 18, 2026
04980e3
fix: scope DeleteOrgMember by org_id to prevent cross-org IDOR
aspectrr Feb 18, 2026
4b6ea70
feat: add live boolean to CreateSandbox, remove base_image from user-…
aspectrr Feb 18, 2026
2478d74
fix: address PR #65 review findings - security, error handling, type …
aspectrr Feb 18, 2026
6fa6843
fix: delete landing-page ci, update demo scripts
aspectrr Feb 18, 2026
b66477b
fix: address remaining PR #65 review findings
aspectrr Feb 18, 2026
ecd5005
fix: address all PR #65 review findings - billing stubs, race conditi…
aspectrr Feb 18, 2026
c19853e
fix: harden API security, billing accuracy, and placement logic
aspectrr Feb 19, 2026
afce088
fix: resolve eslint errors in landing page components
aspectrr Feb 19, 2026
5a164d6
fix: consolidate billing routes and fix calculator pricing
aspectrr Feb 19, 2026
d30db5e
feat: add telemetry, harden auth/billing, improve orchestrator placement
aspectrr Feb 19, 2026
709cb28
fix: resolve eslint errors in posthog and billing page
aspectrr Feb 19, 2026
6e0ec3d
feat: wire daemon connection spinner, remove install script, update d…
aspectrr Feb 19, 2026
f28c13f
fix: address 26+ PR review findings across security, correctness, bil…
aspectrr Feb 19, 2026
173662a
fix: address 39 PR review findings across security, correctness, and …
aspectrr Feb 20, 2026
3e95723
fix: add scripts and internal host exec
aspectrr Feb 20, 2026
6a39598
feat: add onboarding endpoint, randomize host selection, improve web …
aspectrr Feb 20, 2026
0ac5c2c
fix: address 5 PR review findings - stream race, placement scoring, d…
aspectrr Feb 21, 2026
f1aa9ee
fix: address 9 PR review findings - id.Generate panic, type assertion…
aspectrr Feb 21, 2026
a57335a
fix: enforce org-scoped sandbox lookups at DB layer, fix zero-billing…
aspectrr Feb 21, 2026
3699286
feat: replace DB polling with registry-based billing metering
aspectrr Feb 21, 2026
14fa38d
fix: update docs, goreleaser
aspectrr Feb 21, 2026
cf23b3f
fix: nits on swagger types
aspectrr Feb 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
106 changes: 46 additions & 60 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ on:

jobs:
# Go services - fluid CLI
fluid:
fluid-cli:
name: Fluid CLI
runs-on: ubuntu-latest
defaults:
run:
working-directory: fluid
working-directory: fluid-cli

steps:
- uses: actions/checkout@v4
Expand All @@ -24,12 +24,7 @@ jobs:
uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: fluid/go.sum

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libvirt-dev
cache-dependency-path: fluid-cli/go.sum

- name: Download dependencies
run: go mod download
Expand All @@ -38,22 +33,22 @@ jobs:
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: fluid
args: --build-tags=libvirt --timeout=10m
working-directory: fluid-cli
args: --timeout=10m

- name: Test
run: go test -v -race --tags libvirt ./...
run: go test -v -race ./...

- name: Build
run: go build --tags libvirt -o bin/fluid ./cmd/fluid
run: go build -o bin/fluid ./cmd/fluid-cli

# Go services - fluid-remote API
fluid-remote:
name: Fluid Remote API
# Go services - fluid daemon
fluid-daemon:
name: Fluid Daemon
runs-on: ubuntu-latest
defaults:
run:
working-directory: fluid-remote
working-directory: fluid-daemon

steps:
- uses: actions/checkout@v4
Expand All @@ -62,12 +57,39 @@ jobs:
uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: fluid-remote/go.sum
cache-dependency-path: fluid-daemon/go.sum

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y libvirt-dev
- name: Download dependencies
run: go mod download

- name: Lint
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: fluid-daemon

- name: Test
run: go test -v -race ./...

- name: Build
run: go build -o bin/fluid-daemon ./cmd/fluid-daemon

# Go services - API
api:
name: API
runs-on: ubuntu-latest
defaults:
run:
working-directory: api

steps:
- uses: actions/checkout@v4

- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: api/go.sum

- name: Download dependencies
run: go mod download
Expand All @@ -76,14 +98,13 @@ jobs:
uses: golangci/golangci-lint-action@v6
with:
version: latest
working-directory: fluid-remote
args: --build-tags=libvirt
working-directory: api

- name: Test
run: go test -v -race --tags libvirt ./...
run: go test -v -race ./...

- name: Build
run: go build --tags libvirt -o bin/fluid-remote ./cmd/api
run: go build -o bin/api ./cmd/server

# Python SDK
sdk:
Expand Down Expand Up @@ -177,38 +198,3 @@ jobs:

- name: Build
run: bun run build

# Landing page
landing-page:
name: Landing Page
runs-on: ubuntu-latest
defaults:
run:
working-directory: landing-page

steps:
- uses: actions/checkout@v4

- name: Set up Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install

- name: Lint
run: bun run lint

- name: Astro check
run: bun run check

- name: Type check
run: bun run typecheck

- name: Build
run: bun run build
env:
PUBLIC_POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
PUBLIC_POSTHOG_HOST: ${{ secrets.POSTHOG_HOST }}
PUBLIC_POSTHOG_DEFAULTS: ${{ secrets.POSTHOG_DEFAULTS }}
110 changes: 59 additions & 51 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,85 +3,78 @@ version: 2
project_name: fluid
before:
hooks:
- sh -c "cd fluid-remote && go mod tidy"
- sh -c "cd fluid && go mod tidy"
- sh -c "cd api && go mod tidy"
- sh -c "cd fluid-daemon && go mod tidy"
- sh -c "cd fluid-cli && go mod tidy"
builds:
- id: fluid-remote
dir: fluid-remote
main: ./cmd/api/main.go
binary: fluid-remote
- id: api
dir: api
main: ./cmd/server
binary: api
env:
- CGO_ENABLED=1
- CGO_ENABLED=0
goos:
- linux
goarch:
- amd64
- arm64
flags:
- -trimpath
ldflags:
- -s -w
- -X main.version={{ .Version }}
- -X main.commit={{ .Commit }}
- -X main.date={{ .Date }}
- id: fluid-daemon
dir: fluid-daemon
main: ./cmd/fluid-daemon
binary: fluid-daemon
env:
- CGO_ENABLED=0
goos:
- linux
goarch:
- amd64
- arm64
flags:
- -trimpath
tags:
- libvirt
ldflags:
- -s -w
- -X main.version={{ .Version }}
- -X main.commit={{ .Commit }}
- -X main.date={{ .Date }}
overrides:
- goos: linux
goarch: arm64
env:
- CC=aarch64-linux-gnu-gcc
- CXX=aarch64-linux-gnu-g++
- CGO_ENABLED=1
- CGO_LDFLAGS=-L/usr/lib/aarch64-linux-gnu
- PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
- goos: linux
goarch: amd64
env:
- CC=gcc
- CXX=g++
- CGO_ENABLED=1
- id: fluid
dir: fluid
main: ./cmd/fluid
dir: fluid-cli
main: ./cmd/fluid-cli
binary: fluid
env:
- CGO_ENABLED=1
- CGO_ENABLED=0
goos:
- linux
goarch:
- amd64
- arm64
flags:
- -trimpath
tags:
- libvirt
ldflags:
- -s -w
- -X main.version={{ .Version }}
- -X main.commit={{ .Commit }}
- -X main.date={{ .Date }}
overrides:
- goos: linux
goarch: arm64
env:
- CC=aarch64-linux-gnu-gcc
- CXX=aarch64-linux-gnu-g++
- CGO_ENABLED=1
- CGO_LDFLAGS=-L/usr/lib/aarch64-linux-gnu
- PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig
- goos: linux
goarch: amd64
env:
- CC=gcc
- CXX=g++
- CGO_ENABLED=1
archives:
- id: fluid-remote
- id: api
builds:
- fluid-remote
- api
name_template: >-
fluid-remote_{{ .Version }}_{{ .Os }}_{{ .Arch }}
api_{{ .Version }}_{{ .Os }}_{{ .Arch }}
files:
- README.md
- LICENSE
- id: fluid-daemon
builds:
- fluid-daemon
name_template: >-
fluid-daemon_{{ .Version }}_{{ .Os }}_{{ .Arch }}
files:
- README.md
- LICENSE
Expand Down Expand Up @@ -134,22 +127,37 @@ changelog:
- "^docs:"
- "^test:"
nfpms:
- id: fluid-remote
package_name: fluid-remote
- id: api
package_name: api
builds:
- fluid-remote
- api
bindir: /usr/local/bin
vendor: "Fluid.sh"
homepage: "https://github.com/aspectrr/fluid.sh"
maintainer: "Collin Pfeifer <cpfeifer@madcactus.org>"
description: "Control-plane API for managing libvirt-based VM sandboxes"
description: "Control-plane API for fluid.sh sandbox management"
license: "MIT"
formats:
- deb
- rpm
dependencies:
- openssh-client
- postgresql-client
- id: fluid-daemon
package_name: fluid-daemon
builds:
- fluid-daemon
bindir: /usr/local/bin
vendor: "Fluid.sh"
homepage: "https://github.com/aspectrr/fluid.sh"
maintainer: "Collin Pfeifer <cpfeifer@madcactus.org>"
description: "Background daemon for managing VM sandboxes on a host"
license: "MIT"
formats:
- deb
- rpm
dependencies:
- openssh-client
- id: fluid
package_name: fluid
builds:
Expand Down
29 changes: 16 additions & 13 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# fluid.sh

Autonomous AI agents for infrastructure -- with human approval.
Autonomous AI agents for infrastructure - with human approval.

## What This Is

Expand All @@ -9,11 +9,12 @@ fluid.sh lets AI agents do infrastructure work in isolated VM sandboxes. Agent w
## Project Structure

```
fluid/ # Go CLI & API - VM management via libvirt
web/ # React - UI for monitoring/approval
sdk/ # Python SDK - Build agents
examples/ # Working agent examples
landing-page/ # Astro - Marketing site (fluid.sh)
fluid-cli/ # Go CLI - Interactive TUI agent + MCP server
fluid-daemon/ # Go - Background sandbox management daemon
api/ # Go - Control plane REST API + gRPC server
web/ # React - Dashboard UI for monitoring/approval
demo-server/ # Go - WebSocket demo server for interactive docs
proto/ # Protobuf definitions for gRPC services
```

## Testing Required
Expand All @@ -23,15 +24,17 @@ Every code change needs tests. See project-specific AGENTS.md files for details.
## Quick Reference

```bash
docker-compose up --build # Start everything
cd fluid && make test # Test API
cd sdk/fluid-sdk-py && pytest # Test SDK
mprocs # Start all services for dev
cd fluid-cli && make test # Test CLI
cd fluid-daemon && make test # Test daemon
cd api && make test # Test API
cd web && bun run build # Build web
```

## Project Docs

- @fluid/AGENTS.md
- @sdk/AGENTS.md
- @fluid-cli/AGENTS.md
- @web/AGENTS.md
- @examples/agent-example/AGENTS.md
- @landing-page/AGENTS.md
- @api/AGENTS.md
- @fluid-daemon/AGENTS.md
- @demo-server/AGENTS.md
Loading
Loading