{"id":48070040,"url":"https://github.com/warengonzaga/github-repo-banner","last_synced_at":"2026-04-04T14:40:55.187Z","repository":{"id":335656934,"uuid":"1146540347","full_name":"warengonzaga/github-repo-banner","owner":"warengonzaga","description":"URL-based repository banners. Think shields.io, but for headers. ✨","archived":false,"fork":false,"pushed_at":"2026-03-17T09:42:41.000Z","size":223,"stargazers_count":17,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-18T00:56:29.997Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://ghrb.waren.build","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/warengonzaga.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/funding.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"warengonzaga","buy_me_a_coffee":"warengonzaga"}},"created_at":"2026-01-31T09:03:19.000Z","updated_at":"2026-03-15T02:16:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/warengonzaga/github-repo-banner","commit_stats":null,"previous_names":["warengonzaga/github-repo-banner"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/warengonzaga/github-repo-banner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warengonzaga%2Fgithub-repo-banner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warengonzaga%2Fgithub-repo-banner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warengonzaga%2Fgithub-repo-banner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warengonzaga%2Fgithub-repo-banner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/warengonzaga","download_url":"https://codeload.github.com/warengonzaga/github-repo-banner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/warengonzaga%2Fgithub-repo-banner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31403262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T14:40:47.848Z","updated_at":"2026-04-04T14:40:55.173Z","avatar_url":"https://github.com/warengonzaga.png","language":"HTML","funding_links":["https://github.com/sponsors/warengonzaga","https://buymeacoffee.com/warengonzaga"],"categories":[],"sub_categories":[],"readme":"# GitHub Repo Banner\n\n\u003e URL-based repository banners. Think shields.io, but for headers. ✨\n\n![GitHub Repo Banner](https://ghrb.waren.build/banner?header=%F0%9F%8E%A8%F0%9F%96%BC%EF%B8%8F\u0026subheader=%E2%9C%A8+great+projects+deserve+great+repository+banners+%E2%9C%A8\u0026bg=1a1a1a-4a4a4a\u0026color=ffffff\u0026support=true)\u003c!-- Created with GitHub Repo Banner by Waren Gonzaga: https://ghrb.waren.build --\u003e\n\nI believe every repository deserves to look beautiful. Your code is art, your projects deserve stunning visuals to match. But design tools steal hours you don't have. So I built a service that generates gorgeous banners through simple URL parameters. Instant, customizable, and no design tools required. Because great projects deserve great repository banners.\n\n## 🚁 Deploy Your Own\n\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/github-repo-banner?referralCode=KN9JqT\u0026utm_medium=integration\u0026utm_source=template\u0026utm_campaign=generic)\n\nWhen you deploy your own copy, you're directly supporting this project! 💖\n\n## ✨ Features\n\n- 🎨 **Hex-Based Customization** - Full control with hex codes for backgrounds, gradients, and text colors\n- 🌈 **Gradient Support** - Create custom gradients using `bg=HEX1-HEX2` format\n- 💧 **Opacity Control** - 8-digit hex codes with alpha channel (RRGGBBAA)\n- 🔤 **Google Fonts Integration** - Use any font from Google Fonts for custom typography\n- 😀 **Native Emoji** - Full emoji support with proper rendering\n- 🎯 **Simple Icons Support** - Use 3000+ brand icons with `![slug]` syntax (e.g., `![github]`, `![react]`)\n- 📥 **SVG \u0026 PNG Download** - Download banners as SVG or PNG directly from the UI\n- ⚡ **Lightning Fast** - Built with Hono framework for optimal performance\n- 🔒 **Secure** - Input sanitization and validation\n- 🚀 **Edge-Ready** - Deploy to modern platforms like Railway\n\n## 🚀 Quick Start\n\n### Use the Hosted Service\n\nVisit [ghrb.waren.build](https://ghrb.waren.build) to create your banner using the interactive UI.\n\n### Self-Hosting\n\n```bash\ngit clone https://github.com/warengonzaga/github-repo-banner.git\ncd github-repo-banner\npnpm install\npnpm dev\n```\n\n## 📖 Usage Examples\n\n### Basic Examples\n\n**Gradient Background**\n\n```text\nhttps://ghrb.waren.build/banner?header=Vibe+Coding%F0%9F%9A%80\u0026bg=ec4899-3b82f6\u0026color=ffffff\n```\n\n![Gradient Example](https://ghrb.waren.build/banner?header=Vibe+Coding%F0%9F%9A%80\u0026bg=ec4899-3b82f6\u0026color=ffffff)\n\n**Solid Color with Subheader**\n\n```text\nhttps://ghrb.waren.build/banner?header=OSSPH\u0026subheader=Leading+Open+Source+Software+Community+in+the+Philippines\u0026bg=E7F9FF-90C4E8\u0026color=0060A0\n```\n\n![Solid Color Example](https://ghrb.waren.build/banner?header=OSSPH\u0026subheader=Leading+Open+Source+Software+Community+in+the+Philippines\u0026bg=E7F9FF-90C4E8\u0026color=0060A0)\n\n**With Emojis \u0026 Custom Fonts**\n\n```text\nhttps://ghrb.waren.build/banner?header=%F0%9F%A6%9EOpenClaw\u0026subheader=Your+own+personal+AI+assistant.\u0026bg=fee2e2\u0026color=bb2c2c\u0026support=true\n```\n\n![Emoji Example](https://ghrb.waren.build/banner?header=%F0%9F%A6%9EOpenClaw\u0026subheader=Your+own+personal+AI+assistant.\u0026bg=fee2e2\u0026color=bb2c2c\u0026support=true)\n\n**With Brand Icons (Simple Icons)**\n\n```text\nhttps://ghrb.waren.build/banner?header=![github]+Hello+World\u0026bg=1a1a1a-4a4a4a\u0026color=ffffff\nhttps://ghrb.waren.build/banner?header=![react]+![typescript]+Modern+Stack\u0026bg=14b8a6-06b6d4\u0026color=ffffff\n```\n\n![Icon Example](https://ghrb.waren.build/banner?header=![github]+Hello+World\u0026bg=1a1a1a-4a4a4a\u0026color=ffffff)\n\n\u003e Use `![slug]` syntax to embed any icon from [Simple Icons](https://simpleicons.org). Over 3000+ brand icons available! Icons automatically adapt to your text color.\n\n**Transparent/Opacity**\n  \n```text\nhttps://ghrb.waren.build/banner?header=Transparent\u0026bg=00000000\u0026color=ffffff\nhttps://ghrb.waren.build/banner?header=Semi-Transparent\u0026bg=ffffff80\u0026color=000000\n```\n\n## 🌟 Who Uses This\n\nProjects and organizations using GitHub Repo Banner:\n\n- [gogcli](https://github.com/steipete/gogcli) by [steipete](https://github.com/steipete) - Google in your terminal\n- [summarize](https://github.com/steipete/summarize) by [steipete](https://github.com/steipete) - Fast summaries from URLs, files, and media.\n- [BetterGov PH](https://github.com/bettergovph/bettergov) - Making government services better for Filipinos\n\n## 🔒 Privacy \u0026 Transparency\n\n**Privacy by default.** This service does **NOT** track anything by default. If you're using the hosted version at `ghrb.waren.build`, stats tracking status is available at `/health`.\n\n### What We Track (When Enabled)\n- ✅ **Repository names only** - GitHub repository URLs from browser Referer headers\n- ✅ **Public data only** - Already publicly visible on GitHub\n\n### What We Log (Always)\n- 📊 **User actions** - Button clicks (Copy Markdown, Download SVG, etc.) and the banner URL generated\n- 🎨 **Banner content** - Text and styling parameters (publicly displayed content only)\n- 💡 **Purpose** - Understand feature usage and popular banner styles to improve the service\n\n**Note:** All logs are ephemeral (console only, not stored in database). The content you generate is meant to be publicly displayed on GitHub, so logging helps improve the service without violating privacy.\n\n### What We DON'T Track\n- ❌ No IP addresses\n- ❌ No personal information  \n- ❌ No user identities\n- ❌ No analytics or behavioral data\n- ❌ No cookies or tracking pixels\n- ❌ No session data or persistent storage\n\n### Why Track (When Enabled)\nUnderstanding which repositories use this service helps:\n- Gauge community value and impact\n- Make informed maintenance decisions\n- Justify resources for this free service\n\n### Your Data Rights\n- **Full transparency**: View tracked data at `/stats` (when enabled)\n- **Opt-out**: Self-host with stats disabled (default)\n- **Open source**: Review tracking code in this repository\n\n### Self-Hosting Privacy\n**Self-hosted instances have stats disabled by default.** To enable (optional):\n1. Set `ENABLE_STATS=true` in your `.env`\n2. Add Redis service to your Railway project\n3. See [Railway Deployment](#-railway-deployment) below\n\n## 🚂 Railway Deployment\n\n### Basic Deployment (Stats Disabled - Default)\n[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/github-repo-banner?referralCode=KN9JqT)\n\nNo additional configuration needed. The service runs without stats tracking.\n\n### With Stats Tracking (Optional)\n\nIf you want to track which repositories use your instance:\n\n1. **Deploy the service** using the button above\n2. **Add Redis service** in Railway dashboard:\n   - Click \"New\" → \"Database\" → \"Add Redis\"\n   - Railway automatically sets `REDIS_URL`\n3. **Enable stats** in your service variables:\n   - Go to your service settings\n   - Add variable: `ENABLE_STATS=true`\n4. **Redeploy** your service\n\n**Accessing Stats:**\n- View at: `https://your-service.railway.app/stats`\n- Health check includes stats status: `https://your-service.railway.app/health`\n\n**Cost Note:** Redis on Railway has a free tier, then usage-based pricing. Stats tracking is lightweight and should stay within free limits for moderate traffic.\n\n## 🔌 API Reference\n\n### `GET /banner`\n\nGenerate a custom SVG banner.\n\n#### Parameters\n\n| Parameter | Type | Required | Default | Description |\n|-----------|------|----------|---------|-------------|\n| `header` | string | No | \"Hello World\" | Main text (supports emojis and icons) |\n| `subheader` | string | No | - | Optional subtitle text |\n| `bg` | string | No | `1a1a1a-4a4a4a` | Background color in hex format |\n| `color` | string | No | `ffffff` | Header text color (hex without #) |\n| `subheadercolor` | string | No | Same as `color` | Subheader text color |\n| `headerfont` | string | No | - | Google Fonts family name for header (e.g., \"Roboto\") |\n| `subheaderfont` | string | No | - | Google Fonts family name for subheader (e.g., \"Playfair Display\") |\n| `support` | boolean | No | `false` | Show support watermark |\n| `watermarkpos` | string | No | `bottom-right` | Watermark position: `top-left`, `top-right`, `bottom-left`, `bottom-right` |\n\n#### Background Format\n\n| Format | Example | Description |\n|--------|---------|-------------|\n| Gradient | `HEX1-HEX2` | `1a1a1a-4a4a4a` (left to right) |\n| Solid | `HEX` | `ffffff` (single color) |\n| Transparent | `00000000` | Fully transparent |\n| With Opacity | `RRGGBBAA` | `ffffff80` (50% opacity) |\n\n#### Response\n\n- **Content-Type**: `image/svg+xml`\n- **Cache-Control**: `public, max-age=86400` (production)\n- **Size**: 1280×304px\n\n### `GET /`\n\nInteractive banner generator UI with live preview.\n\n### `GET /health`\n\nHealth check endpoint for monitoring and stats status.\n\n**Response (stats disabled):**\n```json\n{\n  \"status\": \"ok\",\n  \"timestamp\": \"2026-02-01T00:00:00.000Z\",\n  \"stats\": {\n    \"enabled\": false\n  }\n}\n```\n\n**Response (stats enabled):**\n```json\n{\n  \"status\": \"ok\",\n  \"timestamp\": \"2026-02-01T00:00:00.000Z\",\n  \"stats\": {\n    \"enabled\": true,\n    \"endpoint\": \"/stats\"\n  }\n}\n```\n\n### `GET /stats`\n\nView repository tracking statistics (when enabled).\n\n**Response (stats disabled):**\n```json\n{\n  \"enabled\": false,\n  \"message\": \"Stats tracking is disabled\"\n}\n```\n\n**Response (stats enabled):**\n```json\n{\n  \"enabled\": true,\n  \"totalRepositories\": 42,\n  \"repositories\": [\"owner/repo1\", \"owner/repo2\"],\n  \"note\": \"Only tracking public GitHub repositories using this service\"\n}\n```\n\n## 🎨 Color Presets\n\nThe UI includes presets for quick access:\n\n### Gradients\n\n| Name | Background | Text Color | Preview |\n|------|------------|------------|---------|\n| Midnight | `1a1a1a-4a4a4a` | `ffffff` | ![Midnight](https://ghrb.waren.build/banner?header=Midnight\u0026bg=1a1a1a-4a4a4a\u0026color=ffffff) |\n| Vibe | `ec4899-3b82f6` | `ffffff` | ![Vibe](https://ghrb.waren.build/banner?header=Vibe\u0026bg=ec4899-3b82f6\u0026color=ffffff) |\n| Ocean | `14b8a6-06b6d4` | `ffffff` | ![Ocean](https://ghrb.waren.build/banner?header=Ocean\u0026bg=14b8a6-06b6d4\u0026color=ffffff) |\n| Railway 🆕 | `431586-9231A8` | `ffffff` | ![Railway](https://ghrb.waren.build/banner?header=Railway\u0026bg=431586-9231A8\u0026color=ffffff) |\n| Cloudflare 🆕 | `F38020-FBAB41` | `ffffff` | ![Cloudflare](https://ghrb.waren.build/banner?header=Cloudflare\u0026bg=F38020-FBAB41\u0026color=ffffff) |\n| Waren 🆕 | `013B84-016EEA` | `ffffff` | ![Waren](https://ghrb.waren.build/banner?header=Waren\u0026bg=013B84-016EEA\u0026color=ffffff) |\n| OSSPH | `E7F9FF-90C4E8` | `0060A0` | ![OSSPH](https://ghrb.waren.build/banner?header=OSSPH\u0026bg=E7F9FF-90C4E8\u0026color=0060A0) |\n\n### Solid Colors\n\n| Name | Background | Text Color | Preview |\n|------|------------|------------|---------|\n| Sky | `87ceeb` | `1e3a8a` | ![Sky](https://ghrb.waren.build/banner?header=Sky\u0026bg=87ceeb\u0026color=1e3a8a) |\n| Molty | `fee2e2` | `bb2c2c` | ![Molty](https://ghrb.waren.build/banner?header=Molty\u0026bg=fee2e2\u0026color=bb2c2c) |\n| Claude | `fde8e3` | `de7356` | ![Claude](https://ghrb.waren.build/banner?header=Claude\u0026bg=fde8e3\u0026color=de7356) |\n| GPT | `10a37f` | `ffffff` | ![GPT](https://ghrb.waren.build/banner?header=GPT\u0026bg=10a37f\u0026color=ffffff) |\n| Minimal | `f3f4f6` | `1f2937` | ![Minimal](https://ghrb.waren.build/banner?header=Minimal\u0026bg=f3f4f6\u0026color=1f2937) |\n\n### Special\n\n| Name | Background | Text Color | Preview |\n|------|------------|------------|---------|\n| Transparent | `00000000` | `ffffff` | ![Transparent](https://ghrb.waren.build/banner?header=Transparent\u0026bg=00000000\u0026color=ffffff) |\n\n\u003e **Tip:** Create any custom gradient or color using hex codes directly in the URL.\n\n## 🛠️ Development\n\n### Tech Stack\n\n**Runtime**: Node.js • **Framework**: [Hono](https://hono.dev/) • **Language**: TypeScript • **Build**: tsup • **Package Manager**: pnpm\n\n### Commands\n\n```bash\npnpm dev      # Development with hot-reload\npnpm build    # Production build\npnpm start    # Start production server\n```\n\n### Environment Variables\n\n```env\nPORT=3000              # Server port\nNODE_ENV=development   # Environment mode\n\n# Stats Tracking (disabled by default - privacy-first)\nENABLE_STATS=false     # Set to 'true' to enable repository tracking\nREDIS_URL=             # Required only if ENABLE_STATS=true\n```\n\nSee `.example.env` for complete documentation.\n\n### Security\n\n- Input sanitization (XSS prevention)\n- Hex color validation\n- Header length limits\n- No external dependencies\n\n## 🤝 Contributing\n\nContributions are welcome! For major changes, open an issue first.\n\n1. Fork the repository\n2. Create feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit with [Clean Commit](https://github.com/wgtechlabs/clean-commit) convention\n4. Push and open a Pull Request\n\n## 📄 License\n\nMIT License - see [LICENSE](LICENSE) file.\n\n## 👨‍💻 Author\n\n**Waren Gonzaga** • [GitHub](https://github.com/warengonzaga) • [Website](https://warengonzaga.com)\n\n---\n\n💻💖☕ by [Waren Gonzaga](https://warengonzaga.com/) | [YHWH](https://www.youtube.com/watch?v=VOZbswniA-g) 🙏\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwarengonzaga%2Fgithub-repo-banner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwarengonzaga%2Fgithub-repo-banner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwarengonzaga%2Fgithub-repo-banner/lists"}