Skip to content

docs(readme): polish project presentation#269

Merged
SantiagoDePolonia merged 5 commits into
mainfrom
docs/readme-pretty
Apr 24, 2026
Merged

docs(readme): polish project presentation#269
SantiagoDePolonia merged 5 commits into
mainfrom
docs/readme-pretty

Conversation

@SantiagoDePolonia

@SantiagoDePolonia SantiagoDePolonia commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Refresh the README header with centered logo, title, badges, and Hacker News callout
  • Reorganize API endpoint documentation into OpenAI-compatible, passthrough, admin, and operations sections
  • Tighten wordmark SVG dimensions for cleaner asset rendering

Checks

  • git diff --check
  • pre-commit hooks during commit

Summary by CodeRabbit

  • Documentation
    • Modernized header with centered logo, reorganized badges, and new “fast and lightweight” tagline.
    • Updated Quick Start to highlight Docker; expanded dashboard image alt text to mention observability, token, and cost tracking.
    • Reworked provider compatibility table with new example model identifiers and feature indicators.
    • Reorganized API docs into separate endpoint tables (OpenAI-compatible, provider passthrough, admin, operations), removed the prior consolidated table and some previously listed admin rows; adjusted gateway configuration formatting.

@mintlify

mintlify Bot commented Apr 24, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated (UTC)
gomodel 🟢 Ready View Preview Apr 24, 2026, 11:28 PM

💡 Tip: Enable Workflows to automatically generate PRs for you.

@coderabbitai

coderabbitai Bot commented Apr 24, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6fdc1d66-bd4b-4fac-ae9d-77d214c74a15

📥 Commits

Reviewing files that changed from the base of the PR and between b26ff33 and b92b6ab.

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

📝 Walkthrough

Walkthrough

README.md restructured: header/badges replaced with centered HTML logo and grouped badges, tagline reworded, dashboard image alt text expanded, Quick Start retitled for Docker, Supported LLM Providers table reworked, API endpoints split into multiple tables, and Gateway Configuration table formatting adjusted.

Changes

Cohort / File(s) Summary
Documentation & README
README.md
Complete README content reformat: replace top header/badges with centered HTML logo/title and grouped badges; update tagline to "fast and lightweight"; expand dashboard GIF alt text; retitle Quick Start to emphasize Docker; restructure Supported LLM Providers table with example model IDs; split the single OpenAI-compatible endpoints table into multiple endpoint tables (OpenAI-compatible, provider passthrough, admin, operations) and remove some old admin rows; adjust Gateway Configuration table column formatting.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Poem

🐰 A README trimmed and shining bright,
Logo centered in the light.
Docker sings the Quick Start tune,
Tables split beneath the moon.
Hops of joy — docs polished right! 🥕✨

🚥 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 'docs(readme): polish project presentation' accurately summarizes the main change—a README.md update that modernizes branding, reorganizes documentation, and improves overall presentation. It is concise, clear, and directly related to the primary purpose of the changeset.
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-pretty

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@codecov-commenter

Copy link
Copy Markdown

⚠️ Please install the 'codecov app svg image' to ensure uploads and comments are reliably processed by Codecov.

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@greptile-apps

greptile-apps Bot commented Apr 24, 2026

Copy link
Copy Markdown

Greptile Summary

This PR polishes the project presentation by redesigning the README header with a centered logo and badge layout, reorganizing the API endpoint table into four logical sections (OpenAI-Compatible, Passthrough, Admin, Operations), and tightening the wordmark SVG dimensions. All changes are documentation-only with no impact on runtime behavior.

Confidence Score: 5/5

Documentation-only PR; safe to merge.

All changes are cosmetic — README reorganization and SVG dimension tweaks. The single finding is a P2 style concern about SVG stroke-boundary margin in the wordmark assets, which does not affect runtime or API behavior.

docs/wordmark-dark.svg and docs/wordmark-light.svg — verify hexagon strokes are not hairline-clipped after the viewBox change.

Important Files Changed

Filename Overview
README.md Header redesigned with centered logo/badge layout; API endpoint table split into four subsections (OpenAI-Compatible, Passthrough, Admin, Operations); example model identifiers updated; minor wording polish throughout.
docs/wordmark-dark.svg ViewBox shifted from "0 0 148 30" to "2 2 126 26" with explicit width/height; hexagon strokes now reach the exact viewBox boundary, risking hairline clipping artifacts in some renderers.
docs/wordmark-light.svg Same viewBox change as wordmark-dark.svg; identical clipping-boundary concern for hexagon strokes at the top/bottom edges of the new viewBox.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    Client([Client]) --> OAI
    Client --> PT
    Client --> ADM
    Client --> OPS

    subgraph OAI["OpenAI-Compatible API"]
        C1["POST /v1/chat/completions"]
        C2["POST /v1/responses"]
        C3["POST /v1/embeddings"]
        C4["GET /v1/models"]
        C5["/v1/files CRUD"]
        C6["/v1/batches CRUD"]
    end

    subgraph PT["Provider Passthrough"]
        P1["GET/POST/... /p/{provider}/..."]
    end

    subgraph ADM["Admin Endpoints"]
        A1["GET /admin/dashboard"]
        A2["/admin/api/v1/usage/*"]
        A3["/admin/api/v1/audit/*"]
        A4["/admin/api/v1/models"]
    end

    subgraph OPS["Operations"]
        O1["GET /health"]
        O2["GET /metrics"]
        O3["GET /swagger/index.html"]
    end
Loading

Reviews (1): Last reviewed commit: "docs(readme): polish project presentatio..." | Re-trigger Greptile

Comment thread docs/wordmark-dark.svg
@@ -1,4 +1,4 @@
<svg viewBox="0 0 148 30" fill="none" xmlns="http://www.w3.org/2000/svg" aria-labelledby="gomodel-wordmark-dark-title">
<svg width="126" height="26" viewBox="2 2 126 26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-labelledby="gomodel-wordmark-dark-title">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Hexagon stroke sits exactly on the viewBox boundary

The hexagon's top vertex is at y=3 with stroke-width="2", placing the outer stroke edge at y=2 — exactly where the new viewBox starts. Likewise the bottom vertex at y=27 puts the outer edge at y=28, exactly the viewBox's bottom limit. Some SVG renderers clip strokes that land precisely on the viewport boundary, producing a hairline cut on the top and bottom of the hexagon.

Adding a 1 px safety margin to the viewBox prevents this:

Suggested change
<svg width="126" height="26" viewBox="2 2 126 26" fill="none" xmlns="http://www.w3.org/2000/svg" aria-labelledby="gomodel-wordmark-dark-title">
<svg width="126" height="26" viewBox="1 1 128 28" fill="none" xmlns="http://www.w3.org/2000/svg" aria-labelledby="gomodel-wordmark-dark-title">

The same applies to docs/wordmark-light.svg.

@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: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.md`:
- Around line 1-7: The README intentionally starts with centered branding, which
triggers markdownlint MD041; to suppress that specific warning, add a
.markdownlint.json file (or update it) to set the MD041 rule to false so the
linter ignores "first line not top-level heading" for this repo; reference the
MD041 rule name in the config and commit the .markdownlint.json alongside the
README to document the suppression.
- Around line 167-214: README was reorganized but CLAUDE.md still mentions API
endpoints that are unchanged; update CLAUDE.md for consistency by aligning its
endpoint list and descriptions with the new README entries (ensure references to
/p/{provider}/..., GET /v1/models, /metrics and any other endpoint strings match
the README wording and table structure), or optionally leave it as-is if you
intentionally want to keep CLAUDE.md untouched—make sure any retained
differences are documented with a short note in CLAUDE.md explaining why it
diverges.
- Around line 194-206: Update the Admin Endpoints table to include the missing
documented routes: add rows for `/admin/api/v1/dashboard/config` (GET —
Dashboard configuration), `/admin/api/v1/cache/overview` (GET — Cache statistics
overview), `/admin/api/v1/usage/user-paths` (GET — Usage breakdown by user
path), `/admin/api/v1/providers/status` (GET — Provider availability status),
`/admin/api/v1/runtime/refresh` (POST — Refresh runtime configuration),
`/admin/api/v1/model-overrides` (GET — List model overrides),
`/admin/api/v1/model-overrides/:selector` (PUT — Create/update model override)
and `/admin/api/v1/model-overrides/:selector` (DELETE — Remove model override),
and `/admin/api/v1/auth-keys` (GET — List authentication keys); follow the same
table formatting and style as the existing entries (method column and concise
description) and place them in a logical position within the Admin Endpoints
section.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 3f1d7498-0ed9-440f-8727-db8bede66f2f

📥 Commits

Reviewing files that changed from the base of the PR and between 54bc2b7 and f15e346.

⛔ Files ignored due to path filters (2)
  • docs/wordmark-dark.svg is excluded by !**/*.svg
  • docs/wordmark-light.svg is excluded by !**/*.svg
📒 Files selected for processing (1)
  • README.md

Comment thread README.md
Comment on lines +1 to +7
<p align="center">
<img alt="GoModel logo" src="docs/logo.svg" width="96">
</p>

[![CI](https://github.com/ENTERPILOT/GoModel/actions/workflows/test.yml/badge.svg)](https://github.com/ENTERPILOT/GoModel/actions/workflows/test.yml)
[![Docs](https://img.shields.io/badge/docs-gomodel-blue)](https://gomodel.enterpilot.io/docs)
[![Discord](https://img.shields.io/badge/Discord-Join-5865F2?logo=discord&logoColor=white)](https://discord.gg/gaEB9BQSPH)
[![Docker Pulls](https://img.shields.io/docker/pulls/enterpilot/gomodel)](https://hub.docker.com/r/enterpilot/gomodel)
[![Go Version](https://img.shields.io/github/go-mod/go-version/ENTERPILOT/GoModel)](https://github.com/ENTERPILOT/GoModel/blob/main/go.mod)
[![Hacker News](https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white)](https://news.ycombinator.com/item?id=47849097)
<h1 align="center">
GoModel - AI Gateway in Go
</h1>

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.

🧹 Nitpick | 🔵 Trivial

Optional: Suppress markdownlint MD041 warning.

The markdownlint warning about the first line not being a top-level heading is expected, as the README intentionally starts with centered branding (logo, title, badges). This is a common pattern for project READMEs.

If desired, you can suppress this specific rule by adding to .markdownlint.json:

{
  "MD041": false
}
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 1 - 7, The README intentionally starts with centered
branding, which triggers markdownlint MD041; to suppress that specific warning,
add a .markdownlint.json file (or update it) to set the MD041 rule to false so
the linter ignores "first line not top-level heading" for this repo; reference
the MD041 rule name in the config and commit the .markdownlint.json alongside
the README to document the suppression.

Comment thread README.md
Comment on lines +167 to +214
## API Endpoints

### OpenAI-Compatible API

| Endpoint | Method | Description |
| --------------------------- | ------ | ------------------------------------------------------------------------------------------------------------ |
| `/v1/chat/completions` | POST | Chat completions (streaming supported) |
| `/v1/responses` | POST | OpenAI Responses API |
| `/v1/embeddings` | POST | Text embeddings |
| `/v1/models` | GET | List available models |
| `/v1/files` | POST | Upload a file (OpenAI-compatible multipart) |
| `/v1/files` | GET | List files |
| `/v1/files/{id}` | GET | Retrieve file metadata |
| `/v1/files/{id}` | DELETE | Delete a file |
| `/v1/files/{id}/content` | GET | Retrieve raw file content |
| `/v1/batches` | POST | Create a native provider batch (OpenAI-compatible schema; inline `requests` supported where provider-native) |
| `/v1/batches` | GET | List stored batches |
| `/v1/batches/{id}` | GET | Retrieve one stored batch |
| `/v1/batches/{id}/cancel` | POST | Cancel a pending batch |
| `/v1/batches/{id}/results` | GET | Retrieve native batch results when available |

### Provider Passthrough

| Endpoint | Method | Description |
| ------------------- | -------------------------------------------- | -------------------------------------------------- |
| `/p/{provider}/...` | GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS | Provider-native passthrough with opaque upstream responses |

### Admin Endpoints

| Endpoint | Method | Description |
| ---------------------------------- | ------ | ------------------------------------------ |
| `/admin/dashboard` | GET | Admin dashboard UI |
| `/admin/api/v1/usage/summary` | GET | Aggregate token usage statistics |
| `/admin/api/v1/usage/daily` | GET | Per-period token usage breakdown |
| `/admin/api/v1/usage/models` | GET | Usage breakdown by model |
| `/admin/api/v1/usage/log` | GET | Paginated usage log entries |
| `/admin/api/v1/audit/log` | GET | Paginated audit log entries |
| `/admin/api/v1/audit/conversation` | GET | Conversation thread around one audit entry |
| `/admin/api/v1/models` | GET | List models with provider type |
| `/admin/api/v1/models/categories` | GET | List model categories |

### Operations Endpoints

| Endpoint | Method | Description |
| --------------------- | ------ | --------------------------------- |
| `/health` | GET | Health check |
| `/metrics` | GET | Prometheus metrics (when enabled) |
| `/swagger/index.html` | GET | Swagger UI (when enabled) |

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.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if CLAUDE.md references API endpoints that might need updating

echo "=== Checking for API endpoint references in CLAUDE.md ==="
if [ -f "CLAUDE.md" ]; then
  rg -n -C3 '/v1/|/admin/|/health|/metrics|API.*(endpoint|route)' CLAUDE.md
else
  echo "CLAUDE.md not found in repository"
fi

Repository: ENTERPILOT/GoModel

Length of output: 4120


CLAUDE.md update is optional for consistency.

CLAUDE.md contains references to several API endpoints (/p/{provider}/..., GET /v1/models, /metrics) that remain unchanged by this documentation reorganization. While updating CLAUDE.md to align with the new README structure would be nice for consistency, it is not required since the actual API contract and endpoint functionality have not changed.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` around lines 167 - 214, README was reorganized but CLAUDE.md still
mentions API endpoints that are unchanged; update CLAUDE.md for consistency by
aligning its endpoint list and descriptions with the new README entries (ensure
references to /p/{provider}/..., GET /v1/models, /metrics and any other endpoint
strings match the README wording and table structure), or optionally leave it
as-is if you intentionally want to keep CLAUDE.md untouched—make sure any
retained differences are documented with a short note in CLAUDE.md explaining
why it diverges.

Comment thread README.md Outdated

@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

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@README.md`:
- Line 18: The README contains a hard-coded badge label in the <a
href="https://news.ycombinator.com/item?id=47849097">...</a> anchor using an
<img alt="Hacker News"
src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white">
which embeds a fixed date and rank; replace that static label with a
neutral/static label (e.g., use an shields.io badge that only says "Hacker News"
or remove the date/rank text) or switch to a dynamic badge URL that does not
hard-code Apr 21 '26 | `#4` so the badge won't become stale (update the <img
src=...> value accordingly).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: a22f312e-afc6-4c37-8420-adea2e5bafd9

📥 Commits

Reviewing files that changed from the base of the PR and between f15e346 and 11777bd.

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

Comment thread README.md
A high-performance AI gateway written in Go, providing a unified OpenAI-compatible API for OpenAI, Anthropic, Gemini, xAI, Groq, OpenRouter, Z.ai, Azure OpenAI, Oracle, Ollama, and more.
<p align="center">
<a href="https://gomodel.enterpilot.io/docs"><img alt="docs GoModel" src="https://img.shields.io/badge/Docs-GoModel-blue"></a>
<a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white"></a>

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

Avoid hard-coded Hacker News rank/date in badge text.

Apr 21 '26 | #4`` will go stale and can mislead readers. Use a neutral static label (e.g., Hacker News) or a fully dynamic badge only.

Suggested README tweak
-  <a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white"></a>
+  <a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Discussion-brightgreen?logo=ycombinator&logoColor=white"></a>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white"></a>
<a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Discussion-brightgreen?logo=ycombinator&logoColor=white"></a>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` at line 18, The README contains a hard-coded badge label in the <a
href="https://news.ycombinator.com/item?id=47849097">...</a> anchor using an
<img alt="Hacker News"
src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white">
which embeds a fixed date and rank; replace that static label with a
neutral/static label (e.g., use an shields.io badge that only says "Hacker News"
or remove the date/rank text) or switch to a dynamic badge URL that does not
hard-code Apr 21 '26 | `#4` so the badge won't become stale (update the <img
src=...> value accordingly).

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

♻️ Duplicate comments (1)
README.md (1)

18-18: ⚠️ Potential issue | 🟡 Minor

Replace the hard-coded Hacker News date/rank badge label.

At Line 18, the badge text (Apr 21 '26 | #4``) will go stale and can mislead readers; use a neutral label (e.g., Hacker News) or rely solely on the dynamic badge already shown at Line 22.

Suggested README tweak
-  <a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Apr%2021%20%2726%20%7C%20%234-brightgreen?logo=ycombinator&logoColor=white"></a>
+  <a href="https://news.ycombinator.com/item?id=47849097"><img alt="Hacker News" src="https://img.shields.io/badge/Hacker%20News-Discussion-brightgreen?logo=ycombinator&logoColor=white"></a>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@README.md` at line 18, Replace the hard-coded date/rank badge label in the
README's Hacker News badge by removing the static text ("Apr 21 '26 | `#4`") from
the <img> tag and replacing it with a neutral label like "Hacker News": update
the alt attribute value and adjust the shields.io src query so the label text is
"Hacker News" (or swap to the dynamic badge used elsewhere) on the <a
href="https://news.ycombinator.com/item?id=47849097"><img ...></a> element to
prevent stale information.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@README.md`:
- Line 18: Replace the hard-coded date/rank badge label in the README's Hacker
News badge by removing the static text ("Apr 21 '26 | `#4`") from the <img> tag
and replacing it with a neutral label like "Hacker News": update the alt
attribute value and adjust the shields.io src query so the label text is "Hacker
News" (or swap to the dynamic badge used elsewhere) on the <a
href="https://news.ycombinator.com/item?id=47849097"><img ...></a> element to
prevent stale information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5ecb0d3d-545d-49ec-ab08-4318bcfe46f7

📥 Commits

Reviewing files that changed from the base of the PR and between 11777bd and b26ff33.

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

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.

2 participants