RepoPilot

googleapis/google-api-ruby-client

REST client for Google APIs

Healthy

Healthy across all four use cases

HealthyDependency

Permissive license, no critical CVEs, actively maintained — safe to depend on.

HealthyFork & modify

Has a license, tests, and CI — clean foundation to fork and modify.

HealthyLearn from

Documented and popular — useful reference codebase to read through.

HealthyDeploy as-is

No critical CVEs, sane security posture — runnable as-is.

  • Solo or near-solo (1 contributor active in recent commits)
  • Last commit 6d ago
  • Apache-2.0 licensed
  • CI configured
  • Tests present

Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests

Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.

Want this for your own repo?

Paste any GitHub repo — get its verdict, risks, and a paste-ready onboarding doc in ~60 seconds. Free, no sign-up.

Embed the "Healthy" badge

Paste into your README — live-updates from the latest cached analysis.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/googleapis/google-api-ruby-client)](https://repopilot.app/r/googleapis/google-api-ruby-client)

Paste at the top of your README.md — renders inline like a shields.io badge.

Preview social card

This card auto-renders when someone shares https://repopilot.app/r/googleapis/google-api-ruby-client on X, Slack, or LinkedIn.

Ask AI about googleapis/google-api-ruby-client

Grounded in the actual source code. Pick a starter question or write your own.

Or write your own question →

Onboarding doc

Onboarding: googleapis/google-api-ruby-client

Generated by RepoPilot · 2026-06-27 · Source

🎯Verdict

GO — Healthy across all four use cases

  • Last commit 6d ago
  • Apache-2.0 licensed
  • CI configured
  • Tests present
  • ⚠ Solo or near-solo (1 contributor active in recent commits)

<sub>Computed from maintenance signals — commit recency, contributor breadth, bus factor, license, CI, tests</sub>

TL;DR

The google-api-ruby-client is an auto-generated REST client library for Google APIs that provides Ruby bindings for 200+ Google services. It consumes Google's Discovery Documents to generate type-safe service classes, data models, and handles authentication (OAuth, API keys, service accounts), retry logic, pagination, and timeouts automatically. Each service gets packaged as a separate gem following the pattern google-apis-<servicename>_<serviceversion> (e.g., google-apis-drive_v3). Monorepo structure: root contains the code generator (lib/, spec/ likely), generated/ directory holds auto-generated service gems (one subdirectory per service like generated/google-apis-abusiveexperiencereport_v1), docs/ contains auth and usage guides. .toys/ directory provides task automation (generate.rb, ci.rb, release.rb). .github/workflows/ automate generation, testing, and releases. .kokoro/ handles internal Google CI/release processes.

👥Who it's for

Ruby developers building applications that integrate with Google services (Drive, Sheets, Calendar, Cloud APIs, etc.). They use this to avoid hand-coding HTTP request logic and instead work with idiomatic Ruby objects. Contributors are Google Cloud Platform SDK maintainers and community members who fix bugs or add service updates.

🌱Maturity & risk

Production-ready and actively maintained by Google. The repo shows 211M lines of Ruby code, extensive CI/CD workflows (.github/workflows/), Kokoro integration for internal release processes, and release-please automation for semantic versioning. Regular generation runs (weekly-generate-updates.yml) keep clients synchronized with API changes. This is Google's official, supported client library.

Low risk for most use cases since Google maintains it as officially supported. Main risk: auto-generated code means bugs in the generator affect all 200+ service gems simultaneously. Dependency risk is minimal (integrates with googleauth gem only). Breaking changes are rare but can occur when Google's Discovery Documents change fundamentally. No visible single-maintainer bottleneck due to corporate backing.

Active areas of work

Active weekly service generation (weekly-generate-updates.yml triggers updates), release automation via release-please.yml and Kokoro, renovate.json indicates dependency updates. The repo tracks API changes continuously and regenerates affected service clients. CI runs on every commit via .github/workflows/ci.yml.

🚀Get running

git clone https://github.com/googleapis/google-api-ruby-client.git && cd google-api-ruby-client && bundle install (uses Gemfile). To regenerate services: bundle exec toys generate (see .toys/generate.rb). To run tests: bundle exec toys ci (see .toys/ci.rb). To work with a specific service gem, cd generated/google-apis-<servicename>_<version> && bundle install.

Daily commands: For development: bundle install && bundle exec toys ci runs the full test suite and linter (uses .rubocop.yml, .rubocop_todo.yml). For generation: bundle exec toys generate-updates regenerates all service clients from fresh Discovery Documents. For releases: bundle exec toys release triggers release-please workflow. Service gems themselves don't 'run'—they're libraries you require and instantiate (see README example: require 'google/apis/drive_v3'; drive = Google::Apis::DriveV3::DriveService.new).

🗺️Map of the codebase

  • README.md — Explains the purpose, usage patterns, and architecture of the entire client library ecosystem—essential for understanding what this repo generates and distributes.
  • .github/workflows/generate-updates.yml — Orchestrates the automated generation of API client gems from Discovery Documents—the core automation pipeline all contributors must understand.
  • .toys/generate.rb — Ruby toy task that drives code generation for new API clients from Discovery schemas—the primary entry point for the generation system.
  • api_list_config.yaml — Configuration that defines which Google APIs are supported and how they map to generated gems—controls the scope of what gets generated.
  • generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb — Exemplar of a generated service class showing the HTTP client pattern, authentication integration, and API method stubs all other generated clients follow.
  • docs/auth-guide.md — Documents authentication patterns (OAuth, API keys, service accounts) that users must implement to use any generated client gem.
  • Gemfile — Root dependency manifest for the monorepo; defines shared test and development dependencies used across all generated client gems.

🛠️How to make changes

Add a new Google API client

  1. Add the API to api_list_config.yaml with its Discovery name and desired gem version (api_list_config.yaml)
  2. Run .toys/generate.rb which reads the config, fetches the Discovery Document, and generates the gem directory (.toys/generate.rb)
  3. The generated gem will appear under generated/google-apis-<servicename>_<version>/ with auto-generated service.rb, classes.rb, and representations.rb (generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb)
  4. Commit the generated directory; release-please will auto-create release PRs for new/modified gems when changes are merged (.github/workflows/release-please.yml)

Customize authentication for a client gem

  1. Edit the generated service.rb to add custom authentication logic or override methods if needed (generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb)
  2. Use googleauth gem integration patterns shown in the service constructor for OAuth/API keys/service accounts (docs/auth-guide.md)
  3. Test authentication in the gem's spec/ directory following the pattern in generated_spec.rb (generated/google-apis-abusiveexperiencereport_v1/spec/generated_spec.rb)

Release a new version of a client gem

  1. Merge changes to generated client code to main branch (generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb)
  2. Release-please workflow in GitHub Actions automatically opens a release PR with bumped version and CHANGELOG entries (.github/workflows/release-please.yml)
  3. Merge the release PR to trigger .kokoro/release.sh which publishes all changed gems to RubyGems (.kokoro/release.sh)
  4. The gem version is tracked in .release-please-manifest.json and updated automatically (.release-please-manifest.json)

Update authentication documentation

  1. Edit the appropriate auth guide (oauth-web.md, oauth-installed.md, oauth-server.md, or auth-guide.md) with new patterns or examples (docs/auth-guide.md)
  2. Reference the googleauth gem integration patterns and link to generated service examples (docs/usage-guide.md)
  3. Update README.md if the authentication story changes at a high level (README.md)

🔧Why these technologies

  • Ruby + Gems — Idiomatic client library distribution for Ruby developers; leverages RubyGems ecosystem for dependency management and versioning.
  • Google Discovery Documents — Machine-readable OpenAPI-like schema for 200+ Google APIs; enables automated, consistent client code generation rather than hand-written clients.
  • googleauth gem — Unified authentication abstraction supporting OAuth 2.0, API keys, and service accounts; shared across all generated clients.
  • GitHub Actions + Kokoro — Dual CI/CD system: GitHub Actions for code review workflows, Kokoro for Google-internal release automation and secrets management.
  • release-please — Automated semantic versioning and changelog generation for each gem; reduces manual release toil across 200+ distributed packages.

⚖️Trade-offs already made

  • Code generation from Discovery Documents instead of hand-written clients

    • Why: Eliminates maintenance burden of 200+ clients and ensures consistency with API changes. Drawback: generated code is less idiomatic, harder to debug, and limits custom optimizations per service.
    • Consequence: Very fast to add new APIs but harder to optimize individual client libraries for performance or DX.
  • Monorepo with generated gems in subdirectories rather than separate repos per gem

    • Why: Single release workflow, coordinated testing, and unified auth library. Drawback: monorepo complexity, slower CI/CD for individual gems, and harder to iterate on one client.
    • Consequence: All gems release together and share test infrastructure, but scaling to 200+ gems creates CI bottlenecks.
  • Automatic regeneration and release-please automation

    • Why: Keeps clients in sync with API changes without human review. Drawback: can introduce breaking changes
    • Consequence: undefined

🪤Traps & gotchas

  1. Generated code is overwritten on each generation run—do not edit generated/ files directly unless you want changes lost. 2. Discovery Documents control what APIs are supported; if Google removes an API, its gem becomes orphaned but may stay in the repo. 3. Weekly generation runs may create auto-generated PRs (via release-please); ensure CI passes before merging to avoid broken gems. 4. Each service gem has its own Gemfile and spec/; running tests requires cd-ing into the specific generated/google-apis-<servicename>_<version>/ directory. 5. Requires googleauth gem for authentication (not included in this repo); users must manage credentials externally. 6. No vendored Discovery Documents in the repo; generation always fetches live specs, so network access is required during generation.

🏗️Architecture

💡Concepts to learn

  • Discovery Document — This entire repo is built around consuming Google's Discovery Documents (JSON specs describing API endpoints, methods, parameters, response types); understanding this format is key to how code generation works
  • Code Generation from API Specifications — Instead of hand-writing service clients, this repo auto-generates 200+ gems from machine-readable API specs, ensuring consistency and reducing maintenance burden—you must understand this pattern to modify the generator
  • OAuth 2.0 Authentication Flows — The library integrates deeply with multiple OAuth flows (service account, installed app, web app); users must understand which flow applies to their use case when setting up credentials
  • REST API Pagination — Generated service methods handle pagination automatically (via nextPageToken patterns); contributors should understand how the generator abstracts this complexity from users
  • Exponential Backoff Retry Strategy — Built-in retry logic with exponential backoff handles transient failures; understanding this is important for debugging timeout issues and tuning reliability
  • Semantic Versioning and Release Automation — This repo uses conventional commits + release-please to auto-manage versions across 200+ gems; understanding this pattern is critical for making releases and managing breaking changes
  • Monorepo Structure with Generated Artifacts — The repo combines hand-written generator code with 200+ auto-generated service gems in a single repo; you must understand the separation to know what to edit vs. what gets overwritten
  • googleapis/google-auth-library-ruby — Provides the authentication layer (OAuth, service accounts, API keys) that google-api-ruby-client depends on; you must use this to set credentials
  • googleapis/gapic-generator-ruby — More modern code generator for Google Cloud APIs using gRPC; complements this repo's REST-focused approach for different services
  • googleapis/google-cloud-ruby — High-level, idiomatic Ruby wrappers around some Google Cloud services; often preferred over raw google-apis-* gems for GCP use cases
  • googleapis/discovery-artifact-manager — Stores and manages Google's Discovery Documents that feed into this repo's code generation pipeline
  • google/api-client — The predecessor multi-language client library; this repo's REST generator is inspired by and evolved from this approach

🪄PR ideas

To work on one of these in Claude Code or Cursor, paste: Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.

Add integration tests for OAuth flow scenarios in docs/oauth-*.md

The repo has OAuth documentation files (oauth-installed.md, oauth-server.md, oauth-web.md, oauth-server.md) but there are no corresponding integration tests validating the documented flows work end-to-end. This is critical for an auth-focused library where breaking OAuth integration would severely impact users. New contributors could add a test suite exercising each documented OAuth scenario.

  • [ ] Create spec/integration/oauth_installed_spec.rb for installed app flow (oauth-installed.md)
  • [ ] Create spec/integration/oauth_web_spec.rb for web app flow (oauth-web.md)
  • [ ] Create spec/integration/oauth_service_account_spec.rb for service account flow (oauth-server.md)
  • [ ] Verify tests use googleauth gem integration as documented in docs/oauth-guide.md
  • [ ] Add these test paths to .github/workflows/ci.yml if not already present

Implement RuboCop auto-correct script and update .rubocop_todo.yml

The repo has both .rubocop.yml and .rubocop_todo.yml (a todo file for deferred violations), but there's no CI workflow or script to gradually reduce technical debt. A contributor could create a toy command (.toys/rubocop-fix.rb) that safely auto-corrects violations in a controlled manner and tracks progress, reducing the burden on future PRs.

  • [ ] Create .toys/rubocop-fix.rb with commands to run rubocop --auto-correct on generated/ and lib/ directories
  • [ ] Add a workflow job in .github/workflows/ci.yml or new .github/workflows/rubocop-debt-reduction.yml to run rubocop and report violations trend
  • [ ] Document progress tracking by comparing .rubocop_todo.yml changes across releases in CONTRIBUTING.md
  • [ ] Test the toy script locally on one generated gem (e.g., generated/google-apis-abusiveexperiencereport_v1)

Add comprehensive spec coverage for generated gem structure validation

With 100+ generated gems in generated/, there's no automated test ensuring each generated gem has the correct boilerplate structure (gemspec, .repo-metadata.json, gem_version.rb, etc.). A contributor could add a spec that validates all generated gems conform to expected file structure and metadata, catching generation issues early.

  • [ ] Create spec/generated_gems_structure_spec.rb to scan all generated/google-apis-* directories
  • [ ] Validate each gem has: .repo-metadata.json, .rspec, .toys.rb, Gemfile, .gemspec file, lib/google/apis/{api}/gem_version.rb
  • [ ] Verify each .repo-metadata.json contains required fields (name, api_shortname, version_semver)
  • [ ] Add this spec to .github/workflows/ci.yml as a required check before merging generation PRs
  • [ ] Document the expected structure in CONTRIBUTING.md for generator maintainers

🌿Good first issues

  • Add missing integration tests for generated service gems that lack spec/ coverage (identify by auditing generated/*/ for missing test files)
  • Improve docs/usage-guide.md with concrete examples for OAuth 2.0 flows for different credential types (service account, web app, installed app)—examples currently exist but are scattered across separate docs
  • Create a CI check in .github/workflows/ci.yml to validate that all generated gems have consistent Gemfile dependencies and version pinning across the monorepo

Top contributors

Click to expand

📝Recent commits

Click to expand
  • 48df6af — feat: Automated regeneration of apihub v1 client (#26398) (yoshi-code-bot)
  • e191073 — feat: Automated regeneration of networkservices v1beta1 client (#26396) (yoshi-code-bot)
  • 9174846 — feat: Automated regeneration of clouddeploy v1 client (#26394) (yoshi-code-bot)
  • c73702c — feat: Automated regeneration of run v2 client (#26390) (yoshi-code-bot)
  • 44976c8 — feat: Automated regeneration of vmwareengine v1 client (#26397) (yoshi-code-bot)
  • d5b62c4 — feat: Automated regeneration of ids v1 client (#26389) (yoshi-code-bot)
  • 8827556 — feat: Automated regeneration of osconfig v2 client (#26395) (yoshi-code-bot)
  • 50491a5 — feat: Automated regeneration of storagebatchoperations v1 client (#26393) (yoshi-code-bot)
  • 7a33967 — feat: Automated regeneration of contactcenteraiplatform v1alpha1 client (#26387) (yoshi-code-bot)
  • 6341296 — feat: Automated regeneration of oracledatabase v1 client (#26392) (yoshi-code-bot)

🔒Security observations

The googleapis/google-api-ruby-client repository demonstrates generally good security practices with official Google support, centralized vulnerability reporting via g.co/vulnz, and documented security policy. However, the automated code generation approach, large number of generated packages, and dependency management present moderate challenges. The primary risks are in the operation and maintenance of generated code consistency across 100+ packages and ensuring proper OAuth usage by consumers. No critical vulnerabilities are evident from the file structure alone, but access to actual dependency specifications and generated code would be needed for complete assessment. Recommendations focus on strengthening code generation validation, dependency scanning, and OAuth security documentation.

  • Medium · Automated Code Generation Without Validation — Repository root - code generation pipeline. The repository uses automated code generation from Discovery Documents to create client libraries. While convenient, this approach may introduce security vulnerabilities if the Discovery Documents contain malicious or incorrect API specifications that aren't manually reviewed. Fix: Implement mandatory security review and validation of generated code before release. Consider adding static analysis to the generation pipeline to detect potential security issues in generated code patterns.
  • Medium · No Visible Dependency Lock File in Provided Context — Gemfile and dependency management. The analysis was performed without access to Gemfile.lock or detailed dependency specifications. This makes it impossible to verify if any dependencies have known vulnerabilities or if versions are pinned securely. Fix: Ensure Gemfile.lock is committed and reviewed. Use 'bundle audit' regularly to check for vulnerable dependencies. Consider using Dependabot or similar tools for automated dependency vulnerability scanning.
  • Low · Potential Information Disclosure in Release Configuration — .kokoro/populate-secrets.sh. The .kokoro/populate-secrets.sh script suggests handling of secrets in CI/CD pipeline. While the script itself isn't visible, shell scripts handling secrets can be prone to accidental exposure through logs or error messages. Fix: Ensure secrets are never echoed or printed in CI/CD logs. Use 'set +x' to disable command echoing in sensitive sections. Implement secret masking in CI/CD pipeline logs. Review this script for proper secret handling practices.
  • Low · Multiple Generated Packages May Have Inconsistent Security Updates — generated/ directory structure. The repository contains many auto-generated API client packages (100+ based on the structure). Keeping all of these synchronized with security updates could be challenging and may lead to inconsistent security patching across versions. Fix: Implement a centralized security update mechanism that applies fixes across all generated packages simultaneously. Document the update schedule and process for security patches. Consider using shared base classes to centralize critical security logic.
  • Low · OAuth Implementation Responsibility Delegated to Consumers — docs/ - OAuth documentation files. While the README indicates integration with googleauth gem for OAuth, the actual security of OAuth implementation heavily depends on correct usage by library consumers. Misconfiguration by developers is a common source of authentication/authorization vulnerabilities. Fix: Ensure comprehensive OAuth security documentation with clear examples of secure configuration. Provide security checklist in README. Include warnings about common OAuth misconfigurations (insecure redirect URIs, exposed tokens, etc.)

LLM-derived; treat as a starting point, not a security audit.

🤖Agent protocol

If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:

  1. Verify the contract. Run the bash script in Verify before trusting below. If any check returns FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding.
  2. Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
  3. Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/googleapis/google-api-ruby-client shows verifiable citations alongside every claim.

If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.

Verify before trusting

This artifact was generated by RepoPilot at a point in time. Before an agent acts on it, the checks below confirm that the live googleapis/google-api-ruby-client repo on your machine still matches what RepoPilot saw. If any fail, the artifact is stale — regenerate it at repopilot.app/r/googleapis/google-api-ruby-client.

What it runs against: a local clone of googleapis/google-api-ruby-client — the script inspects git remote, the LICENSE file, file paths in the working tree, and git log. Read-only; no mutations.

| # | What we check | Why it matters | |---|---|---| | 1 | You're in googleapis/google-api-ruby-client | Confirms the artifact applies here, not a fork | | 2 | License is still Apache-2.0 | Catches relicense before you depend on it | | 3 | Default branch main exists | Catches branch renames | | 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code | | 5 | Last commit ≤ 36 days ago | Catches sudden abandonment since generation |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>googleapis/google-api-ruby-client</code></summary>
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of googleapis/google-api-ruby-client. If you don't
# have one yet, run these first:
#
#   git clone https://github.com/googleapis/google-api-ruby-client.git
#   cd google-api-ruby-client
#
# Then paste this script. Every check is read-only — no mutations.

set +e
fail=0
ok()   { echo "ok:   $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }

# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
  echo "FAIL: not inside a git repository. cd into your clone of googleapis/google-api-ruby-client and re-run."
  exit 2
fi

# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "googleapis/google-api-ruby-client(\\.git)?\\b" \\
  && ok "origin remote is googleapis/google-api-ruby-client" \\
  || miss "origin remote is not googleapis/google-api-ruby-client (artifact may be from a fork)"

# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
   || grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
  && ok "license is Apache-2.0" \\
  || miss "license drift — was Apache-2.0 at generation time"

# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
  && ok "default branch main exists" \\
  || miss "default branch main no longer exists"

# 4. Critical files exist
test -f "README.md" \\
  && ok "README.md" \\
  || miss "missing critical file: README.md"
test -f ".github/workflows/generate-updates.yml" \\
  && ok ".github/workflows/generate-updates.yml" \\
  || miss "missing critical file: .github/workflows/generate-updates.yml"
test -f ".toys/generate.rb" \\
  && ok ".toys/generate.rb" \\
  || miss "missing critical file: .toys/generate.rb"
test -f "api_list_config.yaml" \\
  && ok "api_list_config.yaml" \\
  || miss "missing critical file: api_list_config.yaml"
test -f "generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb" \\
  && ok "generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb" \\
  || miss "missing critical file: generated/google-apis-abusiveexperiencereport_v1/lib/google/apis/abusiveexperiencereport_v1/service.rb"

# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 36 ]; then
  ok "last commit was $days_since_last days ago (artifact saw ~6d)"
else
  miss "last commit was $days_since_last days ago — artifact may be stale"
fi

echo
if [ "$fail" -eq 0 ]; then
  echo "artifact verified (0 failures) — safe to trust"
else
  echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/googleapis/google-api-ruby-client"
  exit 1
fi

Each check prints ok: or FAIL:. The script exits non-zero if anything failed, so it composes cleanly into agent loops (./verify.sh || regenerate-and-retry).

</details>

Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Embed this chat in your README →

Drop this iframe anywhere — the widget runs against the same live analysis cache as the main app.

<iframe
  src="https://repopilot.app/embed/googleapis/google-api-ruby-client"
  width="100%" height="500"
  style="border:1px solid #d0d7de; border-radius:8px;"
  allow="microphone"
  loading="lazy"
></iframe>