{"id":31574672,"url":"https://github.com/man-navlakha/dynamic-image-server","last_synced_at":"2026-05-19T14:04:15.411Z","repository":{"id":316703337,"uuid":"985134011","full_name":"man-navlakha/Dynamic-Image-Server","owner":"man-navlakha","description":"Welcome to the Dynamic Image API, a powerful and flexible service for fetching animal images on demand. This API also includes a sample endpoint for managing user data.","archived":false,"fork":false,"pushed_at":"2026-04-12T11:51:07.000Z","size":31,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-12T13:23:47.200Z","etag":null,"topics":["animal","api","backend","backend-development","express","free"],"latest_commit_sha":null,"homepage":"https://img-server-theta.vercel.app","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/man-navlakha.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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":null,"dco":null,"cla":null}},"created_at":"2025-05-17T06:10:03.000Z","updated_at":"2026-04-12T11:51:13.000Z","dependencies_parsed_at":"2025-09-26T08:27:25.614Z","dependency_job_id":"a5d167af-b845-4efc-91f0-fc6a70e64349","html_url":"https://github.com/man-navlakha/Dynamic-Image-Server","commit_stats":null,"previous_names":["man-navlakha/img-server"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/man-navlakha/Dynamic-Image-Server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/man-navlakha%2FDynamic-Image-Server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/man-navlakha%2FDynamic-Image-Server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/man-navlakha%2FDynamic-Image-Server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/man-navlakha%2FDynamic-Image-Server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/man-navlakha","download_url":"https://codeload.github.com/man-navlakha/Dynamic-Image-Server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/man-navlakha%2FDynamic-Image-Server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33219386,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-19T07:54:09.561Z","status":"ssl_error","status_checked_at":"2026-05-19T07:54:08.508Z","response_time":58,"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":["animal","api","backend","backend-development","express","free"],"created_at":"2025-10-05T16:41:38.193Z","updated_at":"2026-05-19T14:04:15.403Z","avatar_url":"https://github.com/man-navlakha.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Dynamic Image Server\n\nProduction-ready dynamic image APIs built with Express.  \nThis project includes a fully custom GitHub Stats Card API that returns animated SVG cards for GitHub profile READMEs.\n\n![GitHub Stats](https://img-server-theta.vercel.app/api/stats?username=man-navlakha)\n\n---\n\n## Overview\n\nDynamic Image Server provides:\n\n- Dynamic GitHub stats cards as SVG\n- Animal image API with static and Pexels fallback\n- Vehicle image API with SVG fallback generation\n- Generic image resolver endpoint\n- Sample users API\n\nAll APIs are designed for clean embedding, stable response behavior, and production deployment on Vercel.\n\n---\n\n## Base URL\n\nhttps://img-server-theta.vercel.app\n\n---\n\n## Quick Start (Local)\n\n### 1. Install dependencies\n\n    npm install\n\n### 2. Configure environment variables\n\nCreate a .env file in the project root:\n\n    PORT=3000\n    GITHUB_TOKEN=ghp_xxx\n\nNotes:\n\n- GITHUB_TOKEN is optional but strongly recommended for higher GitHub API rate limits.\n- PORT is optional in cloud deployment and mainly useful for local development.\n\n### 3. Run the server\n\n    node man.js\n\n### 4. Run tests\n\n    npm test\n\n---\n\n## GitHub Stats Card API\n\n### Endpoint\n\n- Method: GET\n- Path: /api/stats\n- Content-Type: image/svg+xml; charset=utf-8\n- Response format: SVG only (success and error responses)\n\n### Required Query Parameter\n\n- username: GitHub login name\n\n### Optional Query Parameters\n\n- theme: dark, light, ocean\n- title_color: hex color override, example 00e5ff or #00e5ff\n- text_color: hex color override, example e8f9ff or #e8f9ff\n- icon_color: hex color override, example 40f3ff or #40f3ff\n- bg_color: hex color override, example 022135 or #022135\n- border_color: hex color override for card border\n- show_languages: true or false, also supports 1 or 0, yes or no\n\nVisibility toggles (default true unless noted):\n\n- show_avatar: show/hide profile avatar (default true)\n- show_followers: show/hide followers count (default true)\n- show_following: show/hide following count (default true)\n- show_repos: show/hide public repo count (default true)\n- show_title: show/hide \"GitHub Stats\" title (default true)\n- show_border: show/hide card border (default true)\n- show_languages: show/hide top languages block (default false)\n\nLayout controls:\n\n- border_radius: rounded card corner radius (0..40, default 22)\n- border_width: border width in px (0..6, default 1)\n- card_width: card width in px (320..800, default 430)\n- compact: compact density mode (default false)\n\nImportant:\n\n- Only valid hex values are applied for color overrides.\n- Invalid color values are safely ignored.\n- If using # in URL query values, encode it as %23.\n\n---\n\n## API Usage Examples\n\n    /api/stats?username=man-navlakha\n    /api/stats?username=man-navlakha\u0026theme=dark\n    /api/stats?username=man-navlakha\u0026show_languages=true\n    /api/stats?username=man-navlakha\u0026theme=ocean\u0026title_color=00e5ff\u0026text_color=e8f9ff\u0026icon_color=40f3ff\u0026bg_color=022135\n  /api/stats?username=man-navlakha\u0026show_avatar=false\u0026show_followers=false\u0026show_following=true\u0026show_repos=true\n  /api/stats?username=man-navlakha\u0026border_radius=30\u0026border_width=2\u0026border_color=71f3c6\u0026card_width=540\n  /api/stats?username=man-navlakha\u0026compact=true\u0026show_languages=true\n\n---\n\n## Clickable Demo Links\n\n- Basic Card  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\n\n- Dark Theme  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=dark\n\n- Light Theme  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=light\n\n- Ocean Theme  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=ocean\n\n- With Languages  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026show_languages=true\n\n- Fully Customized  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=ocean\u0026show_languages=true\u0026title_color=ecfeff\u0026text_color=c9ecff\u0026icon_color=3ddad7\u0026bg_color=082f49\n\n- No Avatar + Minimal Stats  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026show_avatar=false\u0026show_followers=false\u0026show_following=true\u0026show_repos=true\n\n- Rounded Border + Wide Card  \n  https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026border_radius=30\u0026border_width=2\u0026border_color=71f3c6\u0026card_width=540\n\n- Error Example (Invalid GitHub User)  \n  https://img-server-theta.vercel.app/api/stats?username=this-user-does-not-exist-xyz123\n\n---\n\n## Markdown Embed Examples\n\n    ![GitHub Stats](https://img-server-theta.vercel.app/api/stats?username=man-navlakha)\n    ![GitHub Stats Dark](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=dark)\n    ![GitHub Stats Light](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=light)\n    ![GitHub Stats Languages](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026show_languages=true)\n    ![GitHub Stats Custom](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026theme=ocean\u0026show_languages=true\u0026title_color=ecfeff\u0026text_color=c9ecff\u0026icon_color=3ddad7\u0026bg_color=082f49)\n    ![GitHub Stats No Avatar](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026show_avatar=false)\n    ![GitHub Stats Wide Rounded](https://img-server-theta.vercel.app/api/stats?username=man-navlakha\u0026card_width=540\u0026border_radius=30\u0026border_width=2\u0026border_color=71f3c6)\n\n---\n\n## Theme Defaults\n\n| Theme | title_color | text_color | icon_color | bg_color |\n|---|---|---|---|---|\n| dark | #ffffff | #d5ddf0 | #71f3c6 | #0f172a |\n| light | #0f172a | #334155 | #0ea5e9 | #ecfeff |\n| ocean | #ecfeff | #b7e3f8 | #3ddad7 | #082f49 |\n\nColor resolution order:\n\n1. Query parameter override\n2. Selected theme default\n3. dark theme fallback\n\n---\n\n## Error Behavior\n\nThe stats API always returns an SVG card, even when errors occur.\n\nStatus mapping:\n\n- 400: missing or invalid query parameters\n- 404: GitHub user not found\n- 502: GitHub API unavailable, rate-limited, or upstream network issue\n\nThis ensures GitHub README embeds remain visually stable.\n\n---\n\n## Performance and Reliability\n\nImplemented protections:\n\n- In-memory cache with 10 minute TTL\n- HTTP cache headers:\n- max-age=300\n- s-maxage=1800\n- stale-while-revalidate=43200\n- Query validation and sanitization\n- Modular architecture for maintainability\n\nStats module structure:\n\n- routes/stats.js\n- lib/stats/githubClient.js\n- lib/stats/query.js\n- lib/stats/themeConfig.js\n- lib/stats/svgRenderer.js\n- lib/stats/cache.js\n\n---\n\n## Vercel Deployment Guide\n\n### 1. Import Project\n\n- Import repository into Vercel\n- Framework preset: Other or Node serverless\n\n### 2. Build Settings\n\n- Build command: none required\n- Output directory: none required\n- Install command: npm install\n- Entrypoint configured via vercel.json to man.js\n\n### 3. Environment Variables\n\nSet in Vercel Project Settings:\n\n- GITHUB_TOKEN recommended\n- PORT optional for local workflows\n\n### 4. Deploy and Test\n\nUse:\n\nhttps://your-project.vercel.app/api/stats?username=man-navlakha\n\n### 5. Verify Response Headers\n\nExpected:\n\n- content-type: image/svg+xml; charset=utf-8\n- cache-control: public, max-age=300, s-maxage=1800, stale-while-revalidate=43200\n\n---\n\n## Scaling Recommendations\n\n1. Move cache from memory to Redis or Upstash for multi-instance consistency.\n2. Add ETag and If-None-Match handling for lower bandwidth.\n3. Add edge caching and regional CDN strategy.\n4. Add GitHub rate-limit aware retry and backoff logic.\n5. Add observability with logs, metrics, and alerts.\n6. Add circuit-breaker fallback under upstream failures.\n\n---\n\n## Existing Endpoints\n\n- /img?text=...  \n  Generic image resolver and redirect from Wikimedia Commons.\n\n- /api/pin?username=...\u0026repo=...  \n  Custom GitHub repository pin card API (SVG), similar to GitHub Readme Stats pin cards.\n\n- /api/animal/:name  \n  Returns configured animal image or falls back to Pexels search.\n\n- /api/vehicle/:name  \n  Returns configured vehicle image or generated SVG label fallback.\n\n- /api/users  \n  Sample user endpoints for demonstration.\n\n---\n\n## Repository Pin Card API\n\nEndpoint:\n\n    /api/pin?username=man-navlakha\u0026repo=blog_ms\n\nSupported query params:\n\n- username (required)\n- repo (required)\n- theme (optional): react, dark, light\n- title or name (optional): custom repository title text\n- owner_name (optional): custom owner label text\n- description (optional): custom description text\n- font_family (optional): custom font family string\n- icon_text (optional): custom icon symbol/emoji\n- image_url (optional): custom logo image URL (http/https)\n- show_image (optional boolean)\n- image_size (optional number, 22..72)\n- bg_color (optional hex)\n- bg_color2 (optional hex)\n- title_color (optional hex)\n- icon_color (optional hex)\n- text_color (optional hex)\n- border_color (optional hex)\n- card_width (optional number, 340..900)\n- card_height (optional number, 140..320)\n- border_radius (optional number, 8..40)\n- border_width (optional number, 0..6)\n- padding (optional number, 16..40)\n- title_size (optional number, 14..40)\n- desc_size (optional number, 11..24)\n- meta_size (optional number, 11..22)\n- hide_border (optional boolean)\n- show_icons (optional boolean)\n- show_owner (optional boolean)\n- show_description (optional boolean)\n- show_stats (optional boolean)\n- show_language (optional boolean)\n- show_repo_icon (optional boolean)\n- show_owner_icon (optional boolean)\n\nExample link:\n\n    https://img-server-theta.vercel.app/api/pin?username=man-navlakha\u0026repo=blog_ms\u0026theme=react\u0026bg_color=20232a\u0026title_color=61D9FA\u0026icon_color=F8D866\u0026hide_border=true\u0026show_icons=true\n\n  Advanced customization example:\n\n    https://img-server-theta.vercel.app/api/pin?username=man-navlakha\u0026repo=blog_ms\u0026theme=react\u0026title=blog_ms\u0026owner_name=man-navlakha\u0026description=Microservices%20based%20Blog%20Application%20with%20Spring%20Boot%20%26%20MySQL.\u0026icon_text=%F0%9F%93%81\u0026show_repo_icon=true\u0026show_owner_icon=true\u0026show_stats=true\u0026show_language=true\u0026card_width=780\u0026card_height=280\u0026title_size=44\u0026desc_size=15\u0026bg_color=20232a\u0026bg_color2=0b1220\u0026title_color=61D9FA\u0026icon_color=F8D866\u0026text_color=c9d1d9\n\nMarkdown embed example:\n\n    \u003ca href=\"https://github.com/man-navlakha/blog_ms\"\u003e\n      \u003cimg width=\"278\" src=\"https://img-server-theta.vercel.app/api/pin?username=man-navlakha\u0026repo=blog_ms\u0026theme=react\u0026bg_color=20232a\u0026title_color=61D9FA\u0026icon_color=F8D866\u0026hide_border=true\u0026show_icons=true\" alt=\"blog_ms Repository Card\" /\u003e\n    \u003c/a\u003e\n\nPin builder panel (live HTML configurator):\n\n    https://img-server-theta.vercel.app/pin-panel\n\n---\n\n## Local Testing Notes\n\nLocal test URL:\n\nhttp://localhost:3000/api/stats?username=man-navlakha\n\nPowerShell quick test:\n\n    curl.exe \"http://localhost:3000/api/stats?username=man-navlakha\u0026show_languages=true\" -o stats.svg\n\nImportant:\n\n- GitHub markdown cannot access localhost.\n- For GitHub profile README, always use public HTTPS URLs.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fman-navlakha%2Fdynamic-image-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fman-navlakha%2Fdynamic-image-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fman-navlakha%2Fdynamic-image-server/lists"}