Skip to content

fix: fix readme, add posthog reverse proxy, update python sdk to fluid - #30

Merged
aspectrr merged 9 commits into
mainfrom
aspectrr/fix-read-me
Feb 6, 2026
Merged

fix: fix readme, add posthog reverse proxy, update python sdk to fluid#30
aspectrr merged 9 commits into
mainfrom
aspectrr/fix-read-me

Conversation

@aspectrr

@aspectrr aspectrr commented Feb 6, 2026

Copy link
Copy Markdown
Owner

Description

  • fix readme to described current project
  • add reverse proxy for posthog
  • add arm64 to goreleaser
  • rename everything from virsh-sandbox to fluid
  • add read-only mode to fluid cli
  • fix python sdk

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Code style update (formatting, renaming)
  • Code refactor (no functional changes)
  • Configuration change
  • Test update

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works

Release Notes

Labels

Copilot AI review requested due to automatic review settings February 6, 2026 22:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR renames the project from virsh-sandbox to fluid, updates the Python SDK accordingly, adds a PostHog reverse proxy, and introduces a read-only mode in the Fluid TUI/agent.

Changes:

  • Renamed Python SDK package/module references from virsh_sandbox to fluid and bumped version to 0.1.0
  • Added PostHog reverse proxy (nginx) container assets
  • Added read-only mode toggle in the TUI/agent and added arm64 to GoReleaser builds

Reviewed changes

Copilot reviewed 279 out of 437 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
sdk/fluid-py/pyproject.toml Renames Python package + mypy targets to fluid and bumps version
sdk/fluid-py/fluid/rest.py Updates exceptions import to the new package path
sdk/fluid-py/fluid/models/internal_rest_vm_info.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_start_sandbox_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_start_sandbox_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_snapshot_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_snapshot_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_session_start_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_session_start_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_session_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_session_end_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_session_end_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_sandbox_info.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_run_command_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_run_command_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_revoke_certificate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_revoke_certificate_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_request_access_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_request_access_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_publish_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_publish_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_list_vms_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_list_sessions_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_list_sandboxes_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_list_sandbox_commands_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_list_certificates_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_inject_ssh_key_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_health_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_get_sandbox_response.py Updates model import paths to fluid.*
sdk/fluid-py/fluid/models/internal_rest_generate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_error_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_discover_ip_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_diff_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_diff_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_destroy_sandbox_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_create_sandbox_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_rest_create_sandbox_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_certificate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_ca_public_key_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_rest_access_error_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_update_task_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_update_task_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_reorder_tasks_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_list_playbooks_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_job_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_job_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_job.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_get_playbook_response.py Updates model import paths to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_export_playbook_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_create_playbook_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_create_playbook_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/internal_ansible_add_task_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/internal_ansible_add_task_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_snapshot.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_store_service_change.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_sandbox.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_store_playbook_task.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_playbook.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_package_info.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_diff.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_store_command_summary.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_store_command_exec_record.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_store_command.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_store_change_diff.py Updates model import paths to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_vm_info.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_start_sandbox_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_start_sandbox_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_snapshot_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_snapshot_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_session_start_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_session_start_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_session_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_session_end_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_session_end_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_sandbox_info.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_run_command_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_run_command_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_revoke_certificate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_revoke_certificate_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_request_access_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_request_access_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_publish_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_publish_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_list_vms_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_list_sessions_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_list_sandboxes_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_list_sandbox_commands_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_list_certificates_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_inject_ssh_key_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_health_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_get_sandbox_response.py Updates model import paths to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_generate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_error_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_discover_ip_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_diff_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_diff_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_destroy_sandbox_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_create_sandbox_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_create_sandbox_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_certificate_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_ca_public_key_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_rest_access_error_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_error_error_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_update_task_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_update_task_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_reorder_tasks_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_list_playbooks_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_job_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_job_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_job.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_get_playbook_response.py Updates model import paths to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_export_playbook_response.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_create_playbook_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_create_playbook_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_add_task_response.py Updates model import path to fluid.*
sdk/fluid-py/fluid/models/fluid_remote_internal_ansible_add_task_request.py Removes unused generated import (re)
sdk/fluid-py/fluid/models/init.py Adds model package exports for the renamed SDK
sdk/fluid-py/fluid/configuration.py Renames config docstring and bumps SDK version string
sdk/fluid-py/fluid/api_client.py Renames imports, updates user agent, and adds compatibility getattr guards
sdk/fluid-py/fluid/api/vms_api.py Updates API imports to fluid.*
sdk/fluid-py/fluid/api/sandbox_api.py Updates API imports to fluid.* and adds pydantic/Annotated imports
sdk/fluid-py/fluid/api/health_api.py Updates API imports to fluid.*
sdk/fluid-py/fluid/api/ansible_playbooks_api.py Updates API imports to fluid.* and adds pydantic/Annotated imports
sdk/fluid-py/fluid/api/ansible_api.py Updates API imports to fluid.* and adds pydantic/Annotated imports
sdk/fluid-py/fluid/api/access_api.py Updates API imports to fluid.* and adds pydantic/Annotated imports
sdk/fluid-py/fluid/api/init.py Adds API package exports
sdk/fluid-py/docs/VMsApi.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/SandboxApi.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestVmInfo.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestStartSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestStartSandboxRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSnapshotResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSnapshotRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSessionStartResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSessionStartRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSessionResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSessionEndResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSessionEndRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestSandboxInfo.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRunCommandResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRunCommandRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRevokeCertificateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRevokeCertificateRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRequestAccessResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestRequestAccessRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestPublishResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestPublishRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestListVMsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestListSessionsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestListSandboxesResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestListSandboxCommandsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestListCertificatesResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestInjectSSHKeyRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestHealthResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestGetSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestGenerateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestErrorResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestDiscoverIPResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestDiffResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestDiffRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestDestroySandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestCreateSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestCreateSandboxRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestCertificateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestCaPublicKeyResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalRestAccessErrorResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleUpdateTaskResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleUpdateTaskRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleReorderTasksRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleListPlaybooksResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleJobResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleJobRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleJob.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleGetPlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleExportPlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleCreatePlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleCreatePlaybookRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleAddTaskResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/InternalAnsibleAddTaskRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/HealthApi.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreSnapshot.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreServiceChange.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreSandbox.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStorePlaybookTask.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStorePlaybook.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStorePackageInfo.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreDiff.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreCommandSummary.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreCommandExecRecord.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreCommand.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalStoreChangeDiff.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestVmInfo.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestStartSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestStartSandboxRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSnapshotResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSnapshotRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSessionStartResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSessionStartRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSessionResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSessionEndResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSessionEndRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestSandboxInfo.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRunCommandResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRunCommandRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRevokeCertificateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRevokeCertificateRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRequestAccessResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestRequestAccessRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestPublishResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestPublishRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestListVMsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestListSessionsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestListSandboxesResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestListSandboxCommandsResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestListCertificatesResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestInjectSSHKeyRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestHealthResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestGetSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestGenerateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestErrorResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestDiscoverIPResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestDiffResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestDiffRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestDestroySandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestCreateSandboxResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestCreateSandboxRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestCertificateResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestCaPublicKeyResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalRestAccessErrorResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalErrorErrorResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleUpdateTaskResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleUpdateTaskRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleReorderTasksRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleListPlaybooksResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleJobResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleJobRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleJob.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleGetPlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleExportPlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleCreatePlaybookResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleCreatePlaybookRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleAddTaskResponse.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/FluidRemoteInternalAnsibleAddTaskRequest.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/AnsiblePlaybooksApi.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/AnsibleApi.md Renames docs import paths to fluid.*
sdk/fluid-py/docs/AccessApi.md Renames docs import paths to fluid.*
sdk/fluid-py/README.md Renames package references and bumps version
sdk/fluid-py/.travis.yml Updates pytest coverage target from virsh_sandbox to fluid
sdk/fluid-py/.openapi-generator/FILES Adds generator file manifest for the new SDK layout
sdk/fluid-py/.gitlab-ci.yml Updates pytest coverage target from virsh_sandbox to fluid
sdk/fluid-py/.github/workflows/python.yml Renames workflow & pytest coverage target to fluid
sdk/.openapi-generator/config.yaml Renames OpenAPI generator properties to fluid + env prefix
scripts/reset-ubuntu.Dockerfile Adds docker image for running reset scripts remotely
scripts/reset-challenge-vm.sh Removes host reset script
scripts/reset-challenge-ubuntu.sh Removes host reset-all script
scripts/hosts.txt Cleans up host list file footer text
scripts/.gitignore Stops ignoring hosts.txt (now committed)
reverse-proxy/nginx.conf Adds nginx reverse proxy configuration for PostHog
reverse-proxy/Dockerfile Adds Dockerfile for reverse proxy container
plans/ralph.sh Removes deprecated/irrelevant plan script
plans/ralph-once.sh Removes deprecated/irrelevant plan script
plans/prd.json Removes deprecated/irrelevant PRD
lefthook.yaml Adds SDK/web formatters and updates hook structure
landing-page/src/pages/index.astro Adds demo embed + refactors feature cards into component
landing-page/src/components/FeatureCard.astro Introduces reusable feature card component
fluid/internal/tui/model.go Adds read-only flag + toggle and passes it to status bar
fluid/internal/tui/logo.go Extends status bar to show mode
fluid/internal/tui/agent.go Adds read-only mode tool restriction and system prompt note
fluid/internal/llm/tools.go Adds GetReadOnlyTools() tool filtering
fluid/cmd/fluid/main.go Updates default VM memory configuration values
fluid/.gitignore Ignores .claude working directory
fluid-remote/cmd/api/main.go Updates API metadata + startup log message
docker-compose.yml Renames services to fluid-* and adjusts compose wiring
.goreleaser.yaml Adds linux/arm64 build targets

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread scripts/reset-ubuntu.Dockerfile
Comment thread scripts/reset-ubuntu.Dockerfile Outdated
Comment thread lefthook.yaml Outdated
Comment thread reverse-proxy/nginx.conf Outdated
<h2 class="mt-14 mb-4 text-xl text-neutral-200">What does that mean?</h2>
<p class="mt-4 text-neutral-400">
Fluid is a terminal agent that do work on production infrastructure like VMs/K8s cluster/etc. by making sandbox clones of the infrastructure for AI agents to work on, allowing the agents to run commands, test connections, edit files, and then generate Infra-as-code like an Ansible Playbook to be applied on production.
Fluid is a terminal agent that helps manage and debug production infrastructure like VMs/K8s cluster by making sandbox clones of the infrastructure for AI agents to work on, allowing the agents to run commands, test connections, edit files, and then generate Infra-as-code like an Ansible Playbook to be applied osn production.

Copilot AI Feb 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct the typos “osn” → “on” and “sanboxes” → “sandboxes” in the landing page copy.

Copilot uses AI. Check for mistakes.
</h2>
<p class="mt-4 text-neutral-400">
Safety. I didn't want CC to SSH into a prod machine from where it is running locally (real problem!). I wanted to lock down the tools it can run to be only on sandboxes while also giving it autonomy to create sandboxes and not have access to anything else.
Safety and observability. I didn't want Claude Code to SSH into a production machine and run bash commands with limited observability/control. Restricting Fluid's tools to only run on sanboxes gives it autonomy to execute commands, write and edit files safely without having to watch every second of it (ofc still good to keep a close eye).

Copilot AI Feb 6, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correct the typos “osn” → “on” and “sanboxes” → “sandboxes” in the landing page copy.

Copilot uses AI. Check for mistakes.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot open a new pull request to apply changes based on this feedback

Comment thread scripts/hosts.txt
Comment thread sdk/fluid-py/fluid/configuration.py Outdated
Comment thread fluid-remote/cmd/api/main.go Outdated
aspectrr and others added 4 commits February 6, 2026 17:10
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

Copilot AI commented Feb 6, 2026

Copy link
Copy Markdown
Contributor

@aspectrr I've opened a new pull request, #31, to work on those changes. Once the pull request is ready, I'll request review from you.

Copilot AI mentioned this pull request Feb 6, 2026
14 tasks
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Code Review

This PR makes several significant updates including renaming from virsh-sandbox to fluid, adding ARM64 support, implementing read-only mode, and adding a PostHog reverse proxy. Overall, the changes are well-structured, but I have some important feedback:

🎯 Major Concerns

1. Security: PostHog Reverse Proxy Configuration

The new reverse proxy at reverse-proxy/nginx.conf proxies ALL traffic to PostHog without any authentication or rate limiting:

location / {
    proxy_pass https://app.posthog.com;
}

Issues:

  • No authentication - anyone who can access this endpoint can send analytics events to your PostHog account
  • No rate limiting - potential for abuse/DoS
  • Proxies the entire PostHog API surface, not just ingestion endpoints

Recommendation:

# Only proxy specific endpoints needed
location /i/ {  # Ingestion endpoint
    proxy_pass https://app.posthog.com/i/;
    # Add rate limiting
    limit_req zone=posthog_limit burst=20 nodelay;
}
location /s/ {  # Static assets
    proxy_pass https://app.posthog.com/s/;
}

2. Docker Compose: Incorrect Volume Mount

Line 62 in docker-compose.yml:

- ./virsh-sandbox/.ssh-ca:/etc/virsh-sandbox:ro

The directory is named virsh-sandbox but the project was renamed to fluid. This will fail if the old directory doesn't exist. Should be:

- ./fluid/.ssh-ca:/etc/fluid:ro

Or use a path that exists in the new structure.

3. Docker Compose: Database Credentials Mismatch

Lines 86-88 use fluid as user/password:

POSTGRES_USER: fluid
POSTGRES_PASSWORD: fluid
POSTGRES_DB: fluid

But line 38 still references the old credentials:

DATABASE_URL=postgresql://virsh_sandbox:virsh_sandbox@postgres:5432/virsh_sandbox

These need to match or the API won't be able to connect to the database.

⚠️ Medium Priority Issues

4. README: Typo

Line 30:

- So we limit agents to chatbots instead of letting them manage and debug on their won

Should be "their own"

5. README: Installation Prerequisites

Line 73 states "Must have Go 1.24+ installed" but Go 1.24 doesn't exist yet (latest stable is 1.23). Should probably be 1.22+ or 1.23+ based on go.mod.

6. Read-Only Mode Implementation

The read-only mode implementation in fluid/internal/llm/tools.go and fluid/internal/tui/agent.go looks solid:

  • Clean separation of read-only vs full tool sets
  • Proper system prompt modification
  • UI feedback with Shift-Tab toggle

Suggestion: Consider adding the list of read-only tools to the system prompt so the agent knows what's available:

systemPrompt += "\n\nYou are in READ-ONLY mode. Available tools: list_sandboxes, get_sandbox, list_vms, read_file, list_playbooks, get_playbook."

7. GoReleaser ARM64 Support

Good addition of ARM64 support:

goarch:
  - amd64
  - arm64

However, note that CGO_ENABLED=1 with cross-compilation for ARM64 requires ARM64 build tools on the host. Ensure your CI environment supports this or add build matrix.

✅ Positive Observations

  1. Comprehensive Renaming - The rename from virsh-sandbox to fluid appears thorough across the codebase
  2. Well-Documented Changes - README updates accurately reflect the current state of the project
  3. TUI Read-Only Mode - Well-implemented safety feature with clear UI indicators
  4. Network Access Approval - The new network approval flow (lines 863-895 in agent.go) adds good security for outbound connections
  5. Context Management - Auto-compaction feature is a smart addition for managing LLM context limits

📋 Testing Required

Per CLAUDE.md, "Every code change needs tests." Please verify:

  • Read-only mode toggle works correctly
  • Network approval dialog functions as expected
  • PostHog reverse proxy is tested (with recommended security fixes)
  • Docker Compose starts successfully with new credentials
  • ARM64 builds complete successfully

🔧 Action Items

Before Merge:

  1. Fix PostHog reverse proxy security issues
  2. Fix Docker Compose volume path and database credentials
  3. Fix README typos and version requirements
  4. Verify all tests pass

Nice to Have:
5. Add read-only mode indicator to agent system prompt
6. Document PostHog reverse proxy purpose in README
7. Add CI matrix for ARM64 builds if not already present


Great work on the feature additions! The read-only mode and network approval features are particularly well-implemented. Please address the blocking issues (especially the security and configuration problems) before merging.

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Pull Request Review: Fix README, Add PostHog Reverse Proxy, Update Python SDK

Overview

This is a substantial PR with 4,221 additions and 5,602 deletions across 436 files. The main changes include:

  • Major rebranding from virsh-sandbox to fluid
  • README improvements
  • PostHog reverse proxy addition
  • ARM64 support in goreleaser
  • Read-only mode for fluid CLI
  • Python SDK updates

✅ Positive Aspects

1. Comprehensive Rebranding

The rename from virsh-sandbox to fluid is thorough and consistent across the codebase, including:

  • Package names
  • Documentation
  • Docker compose services
  • Python SDK

2. Excellent Documentation Updates

The README.md improvements are significant:

  • Clear problem/solution framing
  • Comprehensive installation instructions
  • Platform-specific setup guides (Mac, Linux x86_64, ARM64)
  • Security model documentation
  • Architecture diagrams

3. Read-Only Mode Implementation

The addition of read-only mode in fluid/internal/llm/tools.go is well-designed:

var readOnlyTools = map[string]bool{
    "list_sandboxes": true,
    "read_file":      true,
    "list_playbooks": true,
    // ... only safe operations
}

This provides a clean separation between destructive and non-destructive operations.

4. ARM64 Support

Adding ARM64 to .goreleaser.yaml is excellent for broader platform support:

goarch:
  - amd64
  - arm64

5. PostHog Reverse Proxy

Simple nginx-based reverse proxy for privacy/CORS handling is a clean solution.

⚠️ Issues & Concerns

1. Missing Tests (Critical)

According to the project's CLAUDE.md: "Testing Required: Every code change needs tests."

I found no test file changes in this PR despite:

  • New read-only mode functionality in fluid/internal/llm/tools.go
  • Changes to TUI logic in fluid/internal/tui/agent.go and model.go
  • Major SDK renaming

Required action: Add tests for:

  • GetReadOnlyTools() function to verify correct tool filtering
  • Read-only mode toggle behavior in TUI
  • SDK functionality after renaming

2. Typo in README (Minor)

Line 30 in README.md:

- So we limit agents to chatbots instead of letting them manage and debug on their won

Should be: their own (not their won)

3. Security Consideration: PostHog Proxy

The reverse proxy forwards all headers to PostHog:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Consideration: Ensure this doesn't inadvertently expose sensitive information. This is acceptable for telemetry but should be documented.

4. Docker Compose Inconsistency

In docker-compose.yml:

  • Line 38: Database URL still references old name: virsh_sandbox:virsh_sandbox@postgres:5432/virsh_sandbox
  • Lines 62, 65: Reference to ./virsh-sandbox/.ssh-ca instead of ./fluid/.ssh-ca

These should be updated to reflect the new fluid naming.

5. Massive SDK Regeneration

The Python SDK shows 272 files changed (based on .openapi-generator/FILES). While this appears to be auto-generated code:

  • Verify the generation script ran cleanly - check for any manual edits that shouldn't be there
  • Ensure type annotations are correct per sdk/AGENTS.md guidelines
  • Run SDK tests to verify nothing broke during rename

6. Deleted Files Review

Several files deleted from plans/ directory:

  • plans/prd.json (224 lines)
  • plans/progress.txt (434 lines)
  • Various shell scripts

Question: Were these temporary files, or should they be archived elsewhere? If they contain valuable planning docs, consider keeping them in a docs/archive/ folder.

7. Lefthook Updates

Good updates to use new project structure, but note the Python SDK path:

  • Line 22, 27, 84: References sdk/fluid-py
  • Ensure this directory actually exists in the repo (it should based on the file list)

8. CGO_ENABLED=1 Requirement

The goreleaser config sets CGO_ENABLED=1 for both builds. This is necessary for libvirt bindings but:

  • Makes cross-compilation harder
  • Requires C compiler on build systems
  • This is documented but ensure CI/CD has proper toolchain setup

🔒 Security Review

Good Security Practices:

  1. ✅ Read-only mode properly restricts tool access
  2. ✅ GPG signing of releases maintained
  3. ✅ SSH key verification documentation improved

Recommendations:

  1. Consider rate-limiting the PostHog proxy to prevent abuse
  2. Document PostHog proxy security implications in README
  3. Ensure SSH CA key paths are updated consistently

🎯 Performance Considerations

No significant performance concerns identified. The read-only tool filtering uses a simple map lookup which is O(1).

📝 Code Quality

Good:

  • Clean separation of concerns in read-only mode
  • Well-structured goreleaser config
  • Comprehensive lefthook pre-commit/pre-push hooks

Needs Improvement:

  • Missing test coverage for new functionality
  • Naming consistency (docker-compose still has old refs)

✅ Checklist Review

PR checklist claims:

  • "I have added tests that prove my fix is effective or that my feature works"

This appears incorrect - I found no test files in the changeset. Please add tests or update the checklist.

🎬 Recommendations

Must Fix Before Merge:

  1. Add tests for read-only mode functionality
  2. Fix typo in README.md line 30 (wonown)
  3. Update docker-compose.yml database references from virsh_sandbox to fluid
  4. Run SDK tests to verify Python SDK changes work correctly

Should Fix:

  1. Consider documenting PostHog proxy security implications
  2. Archive deleted planning files if they contain valuable context
  3. Verify all SSH CA paths use new naming scheme

Nice to Have:

  1. Add integration test for TUI read-only mode toggle (Shift-Tab)
  2. Document CGO requirements in CI/CD setup guide

🎉 Conclusion

This is a well-intentioned and comprehensive PR that successfully rebrands the project and adds valuable features. However, it requires test coverage before merging to meet the project's stated standards.

The code quality is generally good, but the missing tests and a few naming inconsistencies need to be addressed.

Recommendation: Request changes for test coverage and naming fixes, then approve once addressed.


Generated by Claude Code PR Review

@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Code Review - PR #30

Summary

This PR implements several important changes:

  • Renames project from virsh-sandbox to fluid throughout the codebase
  • Adds ARM64 support to goreleaser
  • Adds PostHog reverse proxy via nginx
  • Implements read-only mode for the fluid CLI
  • Updates Python SDK to match fluid naming
  • Updates README to reflect current project state

✅ Strengths

1. Comprehensive Renaming
The renaming from virsh-sandbox to fluid appears thorough across the codebase. Good job on maintaining consistency.

2. ARM64 Support
Adding arm64 architecture to both fluid and fluid-remote builds in .goreleaser.yaml is excellent for broader platform support.

3. Read-Only Mode Implementation
The read-only mode implementation in fluid/internal/llm/tools.go is well-designed:

  • Clear separation of read-only tools via readOnlyTools map
  • GetReadOnlyTools() function provides proper filtering
  • Safe tools include: list_sandboxes, get_sandbox, list_vms, read_file, list_playbooks, get_playbook

4. Security - Reverse Proxy
The PostHog reverse proxy is a good addition for privacy and avoiding ad-blockers.


⚠️ Issues & Concerns

🔴 Critical Issues

1. Database Credentials Inconsistency (docker-compose.yml:38)
The database URL still references virsh_sandbox but the actual postgres service is configured with fluid credentials. This will cause connection failures when the API tries to connect to the database.

Fix: Update line 38 to use fluid instead of virsh_sandbox for database name, user, and password.

2. Incorrect SDK Path in lefthook.yaml:84
The test-sdk hook references sdk/fluid-sdk-py but based on the file structure, the SDK directory should be sdk/fluid-py.

Impact: Pre-push hooks will fail when running SDK tests.

Fix: Update line 84 to use root: "sdk/fluid-py"

🟡 Medium Priority Issues

3. Reverse Proxy Security Headers Missing
The nginx reverse proxy (reverse-proxy/nginx.conf) is functional but minimal. Consider adding rate limiting, security headers, request size limits, and timeout configurations.

4. Missing Reverse Proxy Service in docker-compose.yml
The reverse proxy Dockerfile and nginx.conf exist, but there is no service definition in docker-compose.yml to actually run it. The proxy will not be deployed without adding a service entry.

5. Incomplete Renaming - Old References Remain
The docker-compose.yml still has references to virsh-sandbox in volume paths (line 62). These should likely be updated to fluid for consistency.

6. README Typo (line 30)
"on their won" should be "on their own"

🟢 Minor/Style Issues

7. Test Coverage
The PR description states "I have added tests that prove my fix is effective or that my feature works" but I do not see test files for the new read-only mode functionality. Consider adding tests for GetReadOnlyTools() and integration tests for read-only mode behavior.


📋 Recommendations

  1. Immediate: Fix the database URL mismatch - this will break the application
  2. Immediate: Fix the SDK path in lefthook.yaml
  3. Before Merge: Add the reverse-proxy service to docker-compose.yml or remove the unused Dockerfile/nginx.conf
  4. Before Merge: Complete the renaming (virsh-sandbox references)
  5. Nice to Have: Add security headers and rate limiting to nginx
  6. Nice to Have: Add tests for read-only mode
  7. Nice to Have: Fix README typo

Verdict

Changes Requested - The PR has good ideas but contains critical configuration errors that will prevent the application from working correctly. Please address the database URL and lefthook path issues before merging.

The read-only mode implementation is well-designed and the ARM64 support is a valuable addition. Once the configuration issues are resolved, this will be a solid improvement to the project.

@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Code Review

This is a substantial PR with 436 files changed (+4222/-5603 lines). I've reviewed the key changes and here's my feedback:

✅ Positives

1. Clean Renaming from virsh-sandbox to fluid

  • Consistent naming across the codebase
  • Updated all references in docs, configs, and code
  • The branding is clearer and more professional

2. ARM64 Support in GoReleaser

  • Great addition in .goreleaser.yaml lines 21-22, 42-43
  • Properly configured for both fluid and fluid-remote binaries
  • This enables broader platform support

3. Read-Only Mode Implementation

  • Well-designed safety feature (fluid/internal/llm/tools.go)
  • Clean separation via readOnlyTools map
  • Proper UI integration with Shift-Tab toggle (fluid/internal/tui/model.go:441-451)
  • Only allows safe query operations (list, get, read operations)

4. PostHog Reverse Proxy

  • Simple nginx-based proxy for analytics
  • Helps with ad blockers and provides better privacy control

5. README Improvements

  • Much more comprehensive documentation
  • Clear separation of CLI vs Remote flavors
  • Better quickstart instructions
  • Added safety/security documentation

🔍 Concerns & Suggestions

1. Docker Compose Inconsistency (docker-compose.yml)

  • Line 38: Database URL still uses old virsh_sandbox username/password
  • Line 62: Volume mount references ./virsh-sandbox/.ssh-ca which should be updated
  • Recommendation: Update these to use fluid naming for consistency

2. Missing Tests
According to your CLAUDE.md: "Every code change needs tests"

  • No test changes visible for the read-only mode feature
  • No tests for the new network approval flow (detectNetworkAccess function)
  • Recommendation: Add tests for GetReadOnlyTools(), detectNetworkAccess(), and read-only mode integration

3. Security: Network Detection Could Be Bypassed
In fluid/internal/tui/agent.go:953-1004, the detectNetworkAccess function has potential bypass issues using simple string matching. Recommendation: Document this as defense-in-depth, not a security boundary, and consider more robust shell parsing.

4. Performance: Buffer Size
In fluid/internal/tui/model.go:720-723, the buffer keeps 100 lines but only shows 20. Consider reducing to 50 lines for better memory usage.

5. README: Typo on Line 30
"...manage and debug on their won" should be "own"

📋 Checklist Before Merge

  • Fix docker-compose.yml naming inconsistencies (lines 38, 62)
  • Add tests for read-only mode
  • Add tests for network detection
  • Fix README typo (line 30)
  • Run cd fluid && make test
  • Run cd sdk/fluid-py && pytest
  • Verify all renamed references work correctly

🎯 Overall Assessment

This is a well-executed refactoring with meaningful improvements (ARM64 support, read-only mode, better docs). The core changes are solid, but there are a few consistency issues and missing tests that should be addressed before merging.

The read-only mode is a particularly nice safety feature that will help users explore without fear of destructive actions.

Recommendation: Request changes for the docker-compose.yml issues and missing tests, then approve once addressed.

@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

PR Review: Rename virsh-sandbox to fluid

Thank you for this significant refactoring effort! This PR introduces valuable features but has some critical issues that need addressing before merge.

🔴 Critical Issues - Must Fix Before Merge

1. Incomplete Renaming (High Priority)

The renaming from virsh-sandbox to fluid is inconsistent across the codebase. Found ~798 occurrences of "virsh-sandbox" still remaining across 185 files.

In docker-compose.yml:

  • Line 38: Database still uses virsh_sandbox credentials
  • Lines 46-47, 62: SSH CA paths still reference virsh-sandbox

In web frontend and Python SDK:

  • Generated code still uses VirshSandbox prefixes in model classes
  • web/src/virsh-sandbox/ directory still exists
  • TypeScript models have virshSandbox naming

Recommendation: Complete the renaming systematically:

  1. Update database credentials in docker-compose.yml
  2. Rename /etc/virsh-sandbox paths to /etc/fluid
  3. Update OpenAPI spec to use "Fluid" prefixes instead of "VirshSandbox"
  4. Regenerate web frontend API client: cd web && bun run generate-api
  5. Regenerate Python SDK: cd sdk && ./scripts/generate.sh

⚠️ Security Concerns

PostHog Reverse Proxy Configuration

The new reverse-proxy/nginx.conf proxies all PostHog traffic without restrictions.

Issues:

  • No rate limiting
  • No access controls
  • Could be abused as an open proxy
  • Proxies all endpoints instead of just PostHog-specific ones

Recommendation: Restrict to specific PostHog endpoints with rate limiting.


⚠️ Missing Test Coverage

The project guidelines (AGENTS.md) require tests for all code changes. No evidence of tests for:

  • Read-only mode functionality
  • Tool filtering logic
  • Network access approval
  • Context compaction feature

Recommendation: Add tests for the new read-only mode and tool filtering logic.


✅ What's Good

1. ARM64 Support

The .goreleaser.yaml changes are well-implemented:

  • Correctly adds arm64 architecture
  • Maintains CGO_ENABLED=1 for both architectures (needed for libvirt)

2. Read-Only Mode

Excellent security feature! The implementation in fluid/internal/llm/tools.go and fluid/internal/tui/agent.go is clean:

  • Properly filters tools to only safe operations
  • Clear UI indication (Shift+Tab to toggle)
  • Good separation of read-only vs full tool sets

3. Network Access Approval

Good addition requiring human approval for network commands (fluid/internal/tui/agent.go:863-895)


📋 Summary

Category Severity Status
Incomplete renaming 🔴 High Needs fix
Security (PostHog proxy) ⚠️ Medium Needs improvement
Missing tests ⚠️ Medium Needs tests
Documentation inconsistency ℹ️ Low Needs update
New features (read-only, ARM64) ✅ Good Approved

🎯 Recommendation: Request Changes

This PR is in an inconsistent state with mixed naming conventions. Before merging:

Must Do:

  1. Complete the virsh-sandbox → fluid renaming across all files
  2. Regenerate web and Python SDK from updated OpenAPI spec
  3. Update database credentials in docker-compose.yml

Should Do:
4. Restrict PostHog reverse proxy endpoints
5. Add tests for new features

Overall: Great features, but the incomplete renaming creates technical debt that will confuse future developers. Please complete the renaming systematically before merge.


cc: @aspectrr - Let me know if you need help with the renaming or SDK regeneration scripts!

@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Code Review: PR #30 - fluid.sh Renaming and Feature Additions

Executive Summary

This is a large PR (436 files, +4222/-5603) implementing several significant changes:

  • Renaming from virsh-sandbox to fluid
  • Adding PostHog reverse proxy
  • Adding ARM64 support
  • Implementing read-only mode in CLI
  • Updating documentation

🔴 CRITICAL Issues (Must Fix Before Merge)

1. Hardcoded Database Credentials

File: docker-compose.yml

Lines 38 and 87 contain hardcoded credentials that are inconsistent and insecure.

Problems:

  • Credentials hardcoded in version control
  • Inconsistent credentials (virsh_sandbox vs fluid)
  • Will cause connection failures

Fix: Use environment variables instead with proper .env file

2. PostHog Reverse Proxy Security

File: reverse-proxy/nginx.conf

Critical vulnerabilities:

  • No authentication - anyone can use it
  • No rate limiting - abuse potential
  • Listens on 0.0.0.0 - exposed to network
  • No IP whitelisting
  • Can be abused as open proxy to PostHog

Recommended: Bind to localhost only, add rate limiting, and implement IP whitelisting

3. Breaking Change Not Marked

The SDK renaming (virsh-sandbox to fluid) is a BREAKING CHANGE but PR is marked as non-breaking.

Impact:

  • All existing users must update their imports
  • Package name changes from virsh_sandbox to fluid

Required actions:

  1. Update PR description to mark as BREAKING CHANGE
  2. Bump major version or document prominently
  3. Add migration guide
  4. Consider deprecation wrapper for smoother transition

🟡 HIGH Priority (Should Fix)

4. Incomplete Renaming

virsh-sandbox references still exist in:

  • docker-compose.yml:62 - Path references old name
  • Various AGENTS.md files still reference old names
  • Web directory may have old paths

5. Missing Tests

PR claims to have added tests but no new test files visible for:

  • Read-only mode functionality
  • Network access detection
  • PostHog proxy behavior

6. ARM64 Build Verification

.goreleaser.yaml adds ARM64 support but:

  • Requires libvirt cross-compilation toolchains
  • CGO_ENABLED=1 complicates cross-compilation
  • No CI validation visible

🟢 MEDIUM Priority (Nice to Have)

7. Minor Documentation Issues

  • README.md:30 - Typo: debug on their won should be debug on their own
  • README.md:298 - Hardcoded version 0.0.4-beta should be dynamic
  • YouTube iframes will not render in GitHub markdown

8. Network Detection Enhancements

Good implementation in fluid/internal/tui/agent.go, but consider adding package managers (apt, yum, dnf) and VCS tools (git, svn) to network detection.

✅ Positive Aspects

  1. Read-only mode - Clean implementation with proper tool filtering
  2. Network access approval - Excellent security workflow
  3. File operations - Smart use of base64 encoding for safe transfers
  4. Documentation - Comprehensive README updates with clear permission tables
  5. Code organization - Good separation of concerns throughout

Recommendations

Before merging:

  1. Fix all CRITICAL security issues (credentials, proxy)
  2. Update PR description to mark breaking changes
  3. Complete virsh-sandbox to fluid renaming
  4. Add tests for new features
  5. Create SDK migration guide

After merging:

  1. Audit git history for accidentally committed secrets
  2. Add security documentation for PostHog proxy
  3. Set up ARM64 CI validation

Final Verdict

Do not merge yet - Critical security issues must be addressed first. The functionality looks solid, but the security concerns around hardcoded credentials and the open proxy are blocking issues.

Once the critical issues are resolved, this will be a great improvement to the project!


Reviewed with Claude Code

@aspectrr
aspectrr merged commit 807f463 into main Feb 6, 2026
5 of 7 checks passed
@aspectrr
aspectrr deleted the aspectrr/fix-read-me branch February 6, 2026 22:46
@claude

claude Bot commented Feb 6, 2026

Copy link
Copy Markdown

Code Review - PR #30

Thank you for this comprehensive PR that transitions the project from virsh-sandbox to fluid! I've reviewed the changes across the codebase. Here's my feedback:

Strengths

  1. Consistent Rebranding: The renaming from virsh-sandbox to fluid is thorough across SDK, docs, and configuration files.

  2. Good ARM64 Support: Adding arm64 architecture to .goreleaser.yaml (line 22, 43) expands platform compatibility.

  3. Read-Only Mode: The new read-only mode feature in the CLI (fluid/internal/llm/tools.go and fluid/internal/tui) is a great safety feature that limits tool access.

  4. Reverse Proxy for PostHog: Adding nginx reverse proxy for analytics is a good privacy-conscious approach.

  5. Network Access Approval: The network detection and approval flow (fluid/internal/tui/agent.go:953-1004) adds important security controls.

⚠️ Issues & Concerns

1. Missing Rate Limiting Configuration (nginx.conf)

limit_req zone=posthog_limit burst=20 nodelay;

Problem: The rate limiting zone posthog_limit is referenced but never defined in the http block.

Fix Needed: Add this before the server block in reverse-proxy/nginx.conf:

http {
    limit_req_zone $binary_remote_addr zone=posthog_limit:10m rate=10r/s;
    
    server {
        # ... existing config
    }
}

2. Security: Missing SSL/TLS for Reverse Proxy

The PostHog reverse proxy forwards to https://app.posthog.com but listens on HTTP (port 8080) without any TLS configuration. This creates a security gap.

Recommendations:

  • Document that this reverse proxy should sit behind a proper TLS terminator (like Caddy or another nginx instance)
  • OR add SSL certificate configuration directly to this nginx config
  • Ensure the deployment architecture doesn't expose port 8080 directly to the internet

3. Docker Compose Networking Concerns

In docker-compose.yml, the reverse-proxy service is not defined, but it's mentioned in the README. Either:

  • Add the reverse-proxy service to docker-compose.yml, OR
  • Remove references to it from the docker-compose documentation

4. Simplified Docker Compose Removed Useful Services

The old docker-compose had more services (tmux-client at :8081). Was this intentional? If so, update documentation that references these services.

5. Large Generated File Changes

The fluid-remote/docs/openapi.yaml has 963 additions and 895 deletions - this appears to be auto-generated. Consider:

  • Adding a comment in the PR description indicating this is regenerated
  • Ensuring the generation script is documented

6. Testing Gap

The PR description says "I have added tests that prove my fix is effective or that my feature works", but I don't see new test files for:

  • Read-only mode functionality
  • Network approval flow
  • New tools added to llm/tools.go

Recommendation: Add unit tests for the new features, especially:

  • fluid/internal/llm/GetReadOnlyTools()
  • Network detection logic in detectNetworkAccess()

7. PostHog Dependency

The reverse proxy adds PostHog analytics. Consider:

  • Making this optional/configurable
  • Adding environment variable to disable analytics
  • Documenting data collection policy

📝 Minor Issues

  1. Cleanup Deleted Files: The PR deletes several script files (plans/prd.json, plans/ralph.sh, etc.) - ensure these aren't referenced elsewhere in docs.

  2. README Iframe Tags: The README contains <iframe> tags for YouTube embeds (lines 57, 101, 189). These won't render in GitHub markdown. Consider using:

    [![Video](thumbnail-url)](https://www.youtube.com/watch?v=VIDEO_ID)
  3. Typo in README Line 226: "tack" should be "track"

    "It will also need a postgres instance running on the control plan to keep tack of commands run"

  4. Code Quality - Long Function: fluid/internal/tui/agent.go has very long functions (e.g., Run() is 329 lines). Consider breaking into smaller, testable functions.

🔒 Security Notes

  1. Network Tool Detection: The detectNetworkAccess() function covers common tools but could be bypassed with:

    • Downloaded binaries with different names
    • Commands like python -c 'import urllib...'
    • Consider documenting this as defense-in-depth, not complete sandboxing
  2. SSH Warning Filtering: The isSSHWarningLine() and filterSSHWarning() functions filter known_hosts warnings. Ensure this doesn't hide actual security warnings.

Recommendations

  1. Fix nginx rate limiting configuration (critical)
  2. Add tests for new read-only mode and network approval features
  3. Document the reverse proxy deployment architecture
  4. Fix README markdown issues (iframes, typo)
  5. Consider making analytics optional

📊 Overall Assessment

This is a solid refactoring PR that successfully rebrands the project and adds useful security features. The main concerns are:

  • Missing nginx rate limit configuration (will cause startup errors)
  • Test coverage for new features
  • Security documentation for the reverse proxy

Recommendation: Request changes to fix the nginx config and add tests before merging.

Great work on the read-only mode and network approval features! These are valuable additions to the security model.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants