Skip to content

docs(readme): document web interface install + usage - #1128

Merged
cristim merged 2 commits into
feat/multicloud-web-frontendfrom
docs/readme-web-interface
Jun 9, 2026
Merged

cristim merged 2 commits into
feat/multicloud-web-frontendfrom
docs/readme-web-interface

Conversation

@cristim

@cristim cristim commented Jun 9, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Adds a new Web Interface section to README.md covering what the browser dashboard provides (recommendations, purchase plans, history, inventory/coverage, RI exchange, settings), how it is served (same Go binary, STATIC_DIR-controlled static file serving), and an honest capabilities/limitations subsection per provider (AWS: production-ready; Azure/GCP: experimental, matching CLI maturity).
  • Adds Deployment subsection: self-hosted only via Terraform, table of supported runtimes per cloud (AWS Lambda/Fargate, GCP Cloud Run, Azure Container Apps), prerequisites, helper-script and manual Terraform commands, and a pointer to docs/DEPLOYMENT.md.
  • Adds Accessing the dashboard subsection: how to retrieve the URL from Terraform outputs per cloud, and the first-login admin bootstrap flow (one-time setup-admin step, retrieving an auto-generated password from Secrets Manager).

Verified against

  • frontend/package.json (TypeScript/Webpack build, frontend capabilities)
  • internal/api/router.go (full route table -- which features are actually wired)
  • internal/server/static.go, http.go, app.go (STATIC_DIR, Lambda/HTTP dual transport, ADMIN_EMAIL/ADMIN_PASSWORD_SECRET bootstrap)
  • terraform/environments/{aws,gcp,azure}/ (compute options, outputs, admin vars)
  • docs/DEPLOYMENT.md (linked rather than duplicated)
  • .markdownlint.yaml + npx markdownlint-cli@0.47.0 README.md passes clean

Test plan

  • Open the rendered README on the PR and verify all three subsections render correctly (tables, code blocks, headings)
  • Confirm no em-dashes, no machine-specific paths, no SaaS/hosted-service language
  • Confirm the Terraform commands match what terraform -chdir=... / terraform output actually produces
  • CI markdownlint check passes

Summary by CodeRabbit

  • Documentation
    • Added Web Interface section documenting the browser-based dashboard shipped with the CLI
    • Documented REST API, dashboard capabilities, and provider maturity levels
    • Added Terraform deployment instructions for self-hosting across supported cloud environments
    • Included admin setup and initial configuration guidance

Add a "Web Interface" section covering what the dashboard provides,
honest capabilities and limitations per provider/feature, Terraform
deployment across AWS/GCP/Azure, and how to access the app and
complete the first-login admin bootstrap.

Verified against: frontend/package.json, internal/api/router.go,
internal/server/static.go + http.go + app.go,
terraform/environments/{aws,gcp,azure}/*, docs/DEPLOYMENT.md.
@cristim cristim added documentation Improvements or additions to documentation triaged Item has been triaged priority/p3 Polish / idea / may never ship urgency/eventually No deadline impact/few Limited audience labels Jun 9, 2026
@cristim

cristim commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 9, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@cristim, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 15 minutes and 27 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: dedd8e3a-9c82-4a21-a728-d3430a5219b7

📥 Commits

Reviewing files that changed from the base of the PR and between 41e93a7 and 5978d61.

📒 Files selected for processing (1)
  • README.md
📝 Walkthrough

Walkthrough

This PR adds a comprehensive "Web Interface" section to the README documenting a browser-based dashboard shipped with the CLI binary. It covers frontend asset serving, REST API exposure, dashboard features and provider coverage, and provides self-hosted Terraform deployment instructions with cloud runtime guidance and admin setup steps.

Changes

Web Interface Documentation

Layer / File(s) Summary
Web Interface documentation section
README.md
README extended with web dashboard section describing frontend serving via STATIC_DIR, REST API under /api/, feature list, provider maturity (AWS primary, Azure/GCP experimental, RI Exchange AWS-focused), and Terraform self-hosted deployment with cloud runtime mappings, prerequisites, quick-deploy script, manual AWS example, app URL retrieval, and initial admin password setup via AWS Secrets Manager.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

🐰 A dashboard blooms in README's page,
Serving frontends, no more cage!
Terraform deploys with cloud-runtime grace,
Web and API—a faster place.
Admin passwords, secrets arranged,
CUDly's interface has changed! 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and clearly describes the main change: adding documentation for the web interface installation and usage in the README.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/readme-web-interface

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai

coderabbitai Bot commented Jun 9, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
README.md (1)

569-569: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix Go version inconsistency.

Line 569 states "Go 1.23 or later" but the badge on line 4 shows "Go 1.25+" and line 489 in the Web Interface section also specifies "Go 1.25+". Update this line to match the project's actual minimum Go version requirement.

🔧 Proposed fix
-- Go 1.23 or later
+- Go 1.25 or later
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 569, Update the inconsistent Go version string by
replacing the text "Go 1.23 or later" with "Go 1.25 or later" (to match the
badge "Go 1.25+" and the Web Interface section) so all references in README.md
consistently state the project's minimum Go version; locate the occurrence of
the exact phrase "Go 1.23 or later" and change it to "Go 1.25 or later".
🧹 Nitpick comments (1)
README.md (1)

549-563: ⚡ Quick win

Consider adding error handling guidance for nested command.

The nested command substitution in lines 556-557 assumes the Terraform output exists and is properly formatted. If the output is empty or the secret doesn't exist, the command will fail silently or produce a confusing error.

📝 Suggested improvement

Consider adding a note about verifying the output exists first, or show the two-step approach:

 ```bash
 # Retrieve the auto-generated admin password (AWS)
+# First, get the secret name:
+terraform -chdir=terraform/environments/aws output admin_password_secret_name
+
+# Then retrieve the password:
 aws secretsmanager get-secret-value \
   --secret-id "$(terraform -chdir=terraform/environments/aws output -raw admin_password_secret_name)" \
   --query SecretString --output text

Alternatively, just add a note: "Ensure the Terraform output `admin_password_secret_name` exists before running this command."
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @README.md around lines 549 - 563, Add guidance to verify the Terraform
output before using it in the nested command: instruct the user to first run
terraform -chdir=terraform/environments/aws output admin_password_secret_name
(or the raw variant) to confirm the value exists and is non-empty, then use that
value in the aws secretsmanager get-secret-value --secret-id "<value>" --query SecretString --output text command; alternatively present the two-step approach
shown in the review (get the secret name first, then call aws secretsmanager get-secret-value) and add a short note to ensure admin_password_secret_name
exists to avoid silent failures.


</details>

<!-- cr-comment:v1:e04b6a9e96eab110fbf7f428 -->

</blockquote></details>

</blockquote></details>

<details>
<summary>🤖 Prompt for all review comments with AI agents</summary>

Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @README.md:

  • Line 463: Replace the ambiguous phrase "Azure Convertible RIs" in the README
    with a clearer term such as "exchangeable Azure VM reservations" to reflect that
    the Azure-specific RI Exchange code path yields Azure VM reservation candidates,
    while the exchange "target offerings" remain AWS Convertible EC2 Reserved
    Instances; update the sentence containing "Azure Convertible RIs" (and any
    nearby phrasing referencing the Azure code path) to use the new wording so it
    doesn't imply Azure supports AWS-style "convertible RI" semantics.

Outside diff comments:
In @README.md:

  • Line 569: Update the inconsistent Go version string by replacing the text "Go
    1.23 or later" with "Go 1.25 or later" (to match the badge "Go 1.25+" and the
    Web Interface section) so all references in README.md consistently state the
    project's minimum Go version; locate the occurrence of the exact phrase "Go 1.23
    or later" and change it to "Go 1.25 or later".

Nitpick comments:
In @README.md:

  • Around line 549-563: Add guidance to verify the Terraform output before using
    it in the nested command: instruct the user to first run terraform -chdir=terraform/environments/aws output admin_password_secret_name (or the raw
    variant) to confirm the value exists and is non-empty, then use that value in
    the aws secretsmanager get-secret-value --secret-id "<value>" --query SecretString --output text command; alternatively present the two-step approach
    shown in the review (get the secret name first, then call aws secretsmanager get-secret-value) and add a short note to ensure admin_password_secret_name
    exists to avoid silent failures.

</details>

<details>
<summary>🪄 Autofix (Beta)</summary>

Fix all unresolved CodeRabbit comments on this PR:

- [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended)
- [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes

</details>

---

<details>
<summary>ℹ️ Review info</summary>

<details>
<summary>⚙️ Run configuration</summary>

**Configuration used**: defaults

**Review profile**: CHILL

**Plan**: Pro

**Run ID**: `a6a7ed1f-36f9-426f-a413-5b9208c9fa5e`

</details>

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 0c10f1a812ce58d39ac5dd3e231a3a054a76cf9f and 41e93a72e6a314813d1891267900510012a11b8e.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `README.md`

</details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment thread README.md
- **Azure**: reservation recommendations and purchases are implemented in the
API handlers (see `internal/api/handler_recommendations.go`,
`providers/azure/`), but Azure support is experimental. The RI Exchange
feature covers Azure Convertible RIs as a distinct code path.

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.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify RI Exchange implementation scope across providers

# Search for Azure-specific RI exchange implementation
rg -n -C3 --type=go 'exchange.*azure|azure.*exchange' -i

# Check RI exchange handler and routing
rg -n -C3 --type=go 'func.*[Ee]xchange.*Handler|HandleRIExchange|ri.exchange'

# Look for provider-specific exchange logic
ast-grep --pattern $'func $_($$$ provider $$$) {
  $$$
  exchange
  $$$
}'

Repository: LeanerCloud/CUDly

Length of output: 50373


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) Show README section around the referenced lines
if [ -f README.md ]; then
  echo "---- README.md:450-480 ----"
  sed -n '450,480p' README.md | nl -ba -w2 -s':'
else
  echo "README.md not found"
fi

# 2) Find where the 'targets AWS' wording exists (in README or elsewhere)
echo "---- Searching for 'targets AWS Convertible EC2' ----"
rg -n -S "targets AWS Convertible EC2|target(s)? AWS Convertible EC2|Convertible EC2 Reserved Instances only" . || true

# 3) Inspect RI exchange handler around target-offerings / execute / quote
echo "---- handler_ri_exchange.go: locate target-offerings and quote/execute ----"
rg -n "target-offerings|listTargetOfferings|execute|quote|Offerings|Convertible" internal/api/handler_ri_exchange.go

echo "---- Show relevant sections of internal/api/handler_ri_exchange.go ----"
# Show around listTargetOfferingsHandler implementation (usually near listTargetOfferings in file)
rg -n "listTargetOfferings|TargetOfferingsResponse" internal/api/handler_ri_exchange.go | head -n 20
# Show chunks around match lines
for ln in $(rg -n "listTargetOfferings|TargetOfferingsResponse" internal/api/handler_ri_exchange.go | awk -F: '{print $1}' | head -n 10); do
  start=$((ln-40)); end=$((ln+80));
  echo "---- internal/api/handler_ri_exchange.go:${start}-${end} (around ${ln}) ----"
  sed -n "${start},${end}p" internal/api/handler_ri_exchange.go | nl -ba -w2 -s':'
done

# 4) Inspect provider-specific execute/quote logic for offerings targets AWS-only
echo "---- Search for AWS-only offering logic in handler_ri_exchange.go and providers ----"
rg -n -S "AWS Convertible|ConvertibleRI|ec2|Offerings|target offer" internal/api/handler_ri_exchange.go providers || true

Repository: LeanerCloud/CUDly

Length of output: 150


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# 1) Show README section around the referenced lines
if [ -f README.md ]; then
  echo "---- README.md:450-480 ----"
  sed -n '450,480p' README.md | nl -ba -w2 -s':'
else
  echo "README.md not found"
fi

# 2) Find where the 'targets AWS' wording exists (in README or elsewhere)
echo "---- Searching for 'targets AWS Convertible EC2' ----"
rg -n -S "targets AWS Convertible EC2|target(s)? AWS Convertible EC2|Convertible EC2 Reserved Instances only" . || true

# 3) Inspect RI exchange handler around target-offerings / execute / quote
echo "---- handler_ri_exchange.go: locate target-offerings and quote/execute ----"
rg -n "target-offerings|listTargetOfferings|execute|quote|Offerings|Convertible" internal/api/handler_ri_exchange.go

echo "---- Show relevant sections of internal/api/handler_ri_exchange.go ----"
rg -n "listTargetOfferings|TargetOfferingsResponse" internal/api/handler_ri_exchange.go | head -n 20
for ln in $(rg -n "listTargetOfferings|TargetOfferingsResponse" internal/api/handler_ri_exchange.go | awk -F: '{print $1}' | head -n 10); do
  start=$((ln-40)); end=$((ln+80));
  echo "---- internal/api/handler_ri_exchange.go:${start}-${end} (around ${ln}) ----"
  sed -n "${start},${end}p" internal/api/handler_ri_exchange.go | nl -ba -w2 -s':'
done

# 4) Inspect provider-specific execute/quote logic for offerings targets AWS-only
echo "---- Search for AWS-only offering logic in handler_ri_exchange.go and providers ----"
rg -n -S "AWS Convertible|ConvertibleRI|ec2|Offerings|target offer" internal/api/handler_ri_exchange.go providers || true

Repository: LeanerCloud/CUDly

Length of output: 150


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Helper to print numbered lines without `nl`
print_range() {
  local file="$1" start="$2" end="$3"
  awk -v s="$start" -v e="$end" 'NR>=s && NR<=e {printf "%d:%s\n", NR, $0}' "$file"
}

# 1) README context around 450-480
if [ -f README.md ]; then
  echo "---- README.md:450-480 ----"
  print_range README.md 450 480
else
  echo "README.md not found"
fi

# 2) Find exact wording in README (and nowhere else)
echo "---- Searching for the exact wording / close variants ----"
rg -n -S "targets AWS Convertible EC2 Reserved Instances only|Convertible EC2 Reserved Instances only|targets AWS Convertible EC2" README.md || true

# 3) Inspect handler_ri_exchange.go around listTargetOfferings and execute/quote
echo "---- handler_ri_exchange.go matches (target-offerings/execute/quote) ----"
rg -n "listTargetOfferings|target-offerings|execute|quote|TargetOfferings" internal/api/handler_ri_exchange.go

echo "---- handler_ri_exchange.go excerpts around listTargetOfferings ----"
# Print a small window around the first few matches
for ln in $(rg -n "listTargetOfferings|target-offerings|TargetOfferings" internal/api/handler_ri_exchange.go | awk -F: '{print $1}' | head -n 5); do
  start=$((ln-60)); end=$((ln+140));
  echo "---- internal/api/handler_ri_exchange.go:${start}-${end} (around ${ln}) ----"
  sed -n "${start},${end}p" internal/api/handler_ri_exchange.go
done

# 4) Confirm Azure source vs target/offering usage
echo "---- Search for Azure reservations / exchangeable Azure RIs usage ----"
rg -n "azure.*RIs|ExchangeableAzureRIs|listExchangeableAzureRIs|ListExchangeableReservations" internal/api/handler_ri_exchange.go providers/azure/services/compute/exchange.go

Repository: LeanerCloud/CUDly

Length of output: 50373


Clarify Azure RI Exchange scope/terminology in README
Lines 463 and 466-467 aren’t contradictory in function: the Azure-specific RI Exchange code path provides exchangeable Azure VM reservation candidates, while the exchange “target offerings” are AWS Convertible EC2 Reserved Instances only. Adjust line 463 to say “exchangeable Azure VM reservations” (or similar) instead of “Azure Convertible RIs” to avoid implying Azure uses the same “convertible RI” concept as AWS.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 463, Replace the ambiguous phrase "Azure Convertible RIs"
in the README with a clearer term such as "exchangeable Azure VM reservations"
to reflect that the Azure-specific RI Exchange code path yields Azure VM
reservation candidates, while the exchange "target offerings" remain AWS
Convertible EC2 Reserved Instances; update the sentence containing "Azure
Convertible RIs" (and any nearby phrasing referencing the Azure code path) to
use the new wording so it doesn't imply Azure supports AWS-style "convertible
RI" semantics.

Add a prominent experimental note to the Web Interface section heading
and opening blockquote. Retitle "AWS Services (Production Ready)" to
"AWS Services" to avoid overstating stability.

Add an "AWS CLI Support Matrix" subsection under Supported Cloud
Providers & Services listing all seven CLI-accessible AWS services
(rds, elasticache, ec2, opensearch, redshift, memorydb, savingsplans)
verified against providers/aws/services/ and cmd/main.go, with RDS
and ElastiCache marked Tested and the remaining five marked
Experimental (seeking testers), per owner guidance.
@cristim

cristim commented Jun 9, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 9, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cristim
cristim merged commit 5213ee6 into feat/multicloud-web-frontend Jun 9, 2026
4 checks passed
@cristim
cristim deleted the docs/readme-web-interface branch July 27, 2026 11:09
cristim added a commit that referenced this pull request Sep 27, 2026
* docs(readme): document web interface install + usage

Add a "Web Interface" section covering what the dashboard provides,
honest capabilities and limitations per provider/feature, Terraform
deployment across AWS/GCP/Azure, and how to access the app and
complete the first-login admin bootstrap.

Verified against: frontend/package.json, internal/api/router.go,
internal/server/static.go + http.go + app.go,
terraform/environments/{aws,gcp,azure}/*, docs/DEPLOYMENT.md.

* docs(readme): mark web GUI experimental + add CLI support matrix

Add a prominent experimental note to the Web Interface section heading
and opening blockquote. Retitle "AWS Services (Production Ready)" to
"AWS Services" to avoid overstating stability.

Add an "AWS CLI Support Matrix" subsection under Supported Cloud
Providers & Services listing all seven CLI-accessible AWS services
(rds, elasticache, ec2, opensearch, redshift, memorydb, savingsplans)
verified against providers/aws/services/ and cmd/main.go, with RDS
and ElastiCache marked Tested and the remaining five marked
Experimental (seeking testers), per owner guidance.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation impact/few Limited audience priority/p3 Polish / idea / may never ship triaged Item has been triaged urgency/eventually No deadline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant